From 130d258f1b8996718894c5a40222af06262c96e1 Mon Sep 17 00:00:00 2001 From: taek Date: Thu, 8 Jun 2023 17:25:57 +0900 Subject: [PATCH 01/33] Fix/stake factory (#7) * added stake functionality to factory * added task for testing userOp with stackUp * added setting for hardhat * added stake factory to follow the storage access rule for associated storage * renamed to TempKernel * deploy script * changed script a bit * renamed to TempKernel * forge fmt * removed console.sol * removed staker and renamed actions to executor * test fixes and callcode test * deployed with deterministic deployment * validator not accessing the 2 dimensional mapping * script done for session key * using simple trick to adapt the storage access rule * Feat/session key owned (#6) * session key owned validator * named variable for mapping * deployed to goerli --- .../DeployKernel.s.sol/5/run-1686212610.json | 104 +++++ .../DeployKernel.s.sol/5/run-1686212623.json | 149 +++++++ .../DeployKernel.s.sol/5/run-latest.json | 149 +++++++ .../80001/run-1685034687.json | 85 ++++ .../80001/run-1685034694.json | 181 ++++++++ .../80001/run-1685034801.json | 85 ++++ .../80001/run-1685034808.json | 181 ++++++++ .../80001/run-1685041894.json | 133 ++++++ .../80001/run-1685041901.json | 385 ++++++++++++++++++ .../80001/run-1685274646.json | 86 ++++ .../80001/run-1685274653.json | 182 +++++++++ .../80001/run-1685552729.json | 86 ++++ .../80001/run-1685552736.json | 182 +++++++++ .../80001/run-1685554144.json | 104 +++++ .../80001/run-1685554151.json | 200 +++++++++ .../80001/run-1685562259.json | 60 +++ .../80001/run-1685562265.json | 124 ++++++ .../80001/run-1685566222.json | 60 +++ .../80001/run-1685566229.json | 124 ++++++ .../DeployKernel.s.sol/80001/run-latest.json | 109 +++-- .../80001/run-1685599437.json | 60 +++ .../80001/run-1685599444.json | 124 ++++++ .../80001/run-latest.json | 124 ++++++ foundry.toml | 3 +- hardhat.config.ts | 1 + lib/account-abstraction | 2 +- package-lock.json | 18 +- package.json | 2 +- scripts/DeployKernel.s.sol | 25 +- scripts/DeploySessionKey.s.sol | 25 ++ src/Kernel.sol | 7 +- src/abstract/KernelStorage.sol | 1 - src/{actions => executor}/ERC721Actions.sol | 0 src/factory/ECDSAKernelFactory.sol | 8 +- src/factory/KernelFactory.sol | 35 +- src/factory/TempKernel.sol | 228 +++++++++++ src/test/TestExecutor.sol | 1 + src/test/TestValidator.sol | 1 - src/utils/KernelHelper.sol | 2 +- src/validator/ECDSAValidator.sol | 1 - src/validator/ERC165SessionKeyValidator.sol | 24 +- src/validator/KillSwitchValidator.sol | 21 +- src/validator/SessionKeyOwnedValidator.sol | 59 +++ tasks/test_userOp.ts | 102 +++++ test/foundry/Kernel.test.sol | 60 ++- test/foundry/KernelExecution.test.sol | 73 ++-- 46 files changed, 3664 insertions(+), 112 deletions(-) create mode 100644 broadcast/DeployKernel.s.sol/5/run-1686212610.json create mode 100644 broadcast/DeployKernel.s.sol/5/run-1686212623.json create mode 100644 broadcast/DeployKernel.s.sol/5/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685034687.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685034694.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685034801.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685034808.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685041894.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685041901.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685274646.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685274653.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685552729.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685552736.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685554144.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685554151.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685562259.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685562265.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685566222.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1685566229.json create mode 100644 broadcast/DeploySessionKey.s.sol/80001/run-1685599437.json create mode 100644 broadcast/DeploySessionKey.s.sol/80001/run-1685599444.json create mode 100644 broadcast/DeploySessionKey.s.sol/80001/run-latest.json create mode 100644 scripts/DeploySessionKey.s.sol rename src/{actions => executor}/ERC721Actions.sol (100%) create mode 100644 src/factory/TempKernel.sol create mode 100644 src/validator/SessionKeyOwnedValidator.sol create mode 100644 tasks/test_userOp.ts diff --git a/broadcast/DeployKernel.s.sol/5/run-1686212610.json b/broadcast/DeployKernel.s.sol/5/run-1686212610.json new file mode 100644 index 00000000..6185ca62 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1686212610.json @@ -0,0 +1,104 @@ +{ + "transactions": [ + { + "hash": "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x5cbf01", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3c", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39", + "initCode": "60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xcc9B83cc9aF4a79663EC9E326c67B0Fd27Afd7f7", + "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xC69eb9FFCDD53cF035a6e3bd5b73C22a43A5dF7A", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x3d", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x59e62", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3e", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xD49a72cb78C44c6bfbf0d471581B7635cF62E81e", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", + "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", + "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011" + ], + "returns": {}, + "timestamp": 1686212610, + "chain": 5, + "multi": false, + "commit": "a119af4" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-1686212623.json b/broadcast/DeployKernel.s.sol/5/run-1686212623.json new file mode 100644 index 00000000..fbc5b055 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1686212623.json @@ -0,0 +1,149 @@ +{ + "transactions": [ + { + "hash": "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x5cbf01", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3c", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39", + "initCode": "60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xcc9B83cc9aF4a79663EC9E326c67B0Fd27Afd7f7", + "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xC69eb9FFCDD53cF035a6e3bd5b73C22a43A5dF7A", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x3d", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x59e62", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3e", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xD49a72cb78C44c6bfbf0d471581B7635cF62E81e", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", + "transactionIndex": "0x3", + "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", + "blockNumber": "0x8b821f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x43f05a", + "gasUsed": "0x3f73a5", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d06126" + }, + { + "transactionHash": "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", + "transactionIndex": "0x4", + "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", + "blockNumber": "0x8b821f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x4bd62b", + "gasUsed": "0x7e5d1", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d06126" + }, + { + "transactionHash": "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011", + "transactionIndex": "0x5", + "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", + "blockNumber": "0x8b821f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x4fadfe", + "gasUsed": "0x3d7d3", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d06126" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1686212623, + "chain": 5, + "multi": false, + "commit": "a119af4" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-latest.json b/broadcast/DeployKernel.s.sol/5/run-latest.json new file mode 100644 index 00000000..fbc5b055 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-latest.json @@ -0,0 +1,149 @@ +{ + "transactions": [ + { + "hash": "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x5cbf01", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3c", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39", + "initCode": "60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xcc9B83cc9aF4a79663EC9E326c67B0Fd27Afd7f7", + "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xC69eb9FFCDD53cF035a6e3bd5b73C22a43A5dF7A", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x3d", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x59e62", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3e", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xD49a72cb78C44c6bfbf0d471581B7635cF62E81e", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", + "transactionIndex": "0x3", + "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", + "blockNumber": "0x8b821f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x43f05a", + "gasUsed": "0x3f73a5", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d06126" + }, + { + "transactionHash": "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", + "transactionIndex": "0x4", + "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", + "blockNumber": "0x8b821f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x4bd62b", + "gasUsed": "0x7e5d1", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d06126" + }, + { + "transactionHash": "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011", + "transactionIndex": "0x5", + "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", + "blockNumber": "0x8b821f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x4fadfe", + "gasUsed": "0x3d7d3", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d06126" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1686212623, + "chain": 5, + "multi": false, + "commit": "a119af4" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685034687.json b/broadcast/DeployKernel.s.sol/80001/run-1685034687.json new file mode 100644 index 00000000..1894193b --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685034687.json @@ -0,0 +1,85 @@ +{ + "transactions": [ + { + "hash": "0xca28197b3c9dc28bbe28690922e7e294c509326d951cd938184b6cbbd98ab03a", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0x2FaC18D2d730355f84f3d08b4843397150a96222", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x34753d", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161312038038061312083398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b6127a48061097c83390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b6080516108956100e760003960008181604b0152818161010b0152818161021b015261026d01526108956000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063037637aa146100465780631bb12e6914610089578063296601cd1461009c575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006d6100973660046103b8565b6100af565b61006d6100aa3660046103b8565b6101bd565b600080858585856040516020016100c9949392919061044f565b6040516020818303038152906040528051906020012090506101b181604051806020016100f5906103ab565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000089898960405160240161013f939291906104a5565b60408051601f19818403018152918152602080830180516001600160e01b031663347d5e2560e21b1790529051610178939291016104f7565b60408051601f19818403018152908290526101969291602001610539565b6040516020818303038152906040528051906020012061036d565b9150505b949350505050565b600080858585856040516020016101d7949392919061044f565b604051602081830303815290604052805190602001209050600061024f8260405180602001610205906103ab565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a8a8a60405160240161013f939291906104a5565b90506001600160a01b0381163b1561026a5791506101b59050565b817f000000000000000000000000000000000000000000000000000000000000000063d1f5789460e01b8989896040516024016102a9939291906104a5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516102e6906103ab565b6102f19291906104f7565b8190604051809103906000f5905080158015610311573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f743788888860405161035b93929190610568565b60405180910390a35050949350505050565b600061037a838330610381565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061058d83390190565b600080600080606085870312156103ce57600080fd5b84356001600160a01b03811681146103e557600080fd5b9350602085013567ffffffffffffffff8082111561040257600080fd5b818701915087601f83011261041657600080fd5b81358181111561042557600080fd5b88602082850101111561043757600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082018190526000906104ca908301848661047c565b95945050505050565b60005b838110156104ee5781810151838201526020016104d6565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105248160608501602087016104d3565b601f01601f1916919091016060019392505050565b6000835161054b8184602088016104d3565b83519083019061055f8183602088016104d3565b01949350505050565b60408152600061057c60408301858761047c565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xA5A7035637487A0D83F9aC6283Cb553F5AA6F0b3", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xf2f00a8b448ee1f113a047411d9c8c35779b7d35f5c5335eddec78eadb29a0cc", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0x04b6041E532E81c91f28302E90204715d3245423", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x00a1bad10995927a410e6fafc50eaa6f281787a2dd4902b41541aad34f9b872c", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xd02669C9bA129211A615CE6829e30fe5a30793Ac", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4c1e6", + "value": "0x0", + "data": "0x60c060405234801561001057600080fd5b5060405161042f38038061042f83398101604081905261002f9161005e565b6001600160a01b039182166080521660a052610098565b6001600160a01b038116811461005b57600080fd5b50565b6000806040838503121561007157600080fd5b825161007c81610046565b602084015190925061008d81610046565b809150509250929050565b60805160a0516103586100d760003960008181608501528181610156015261024001526000818160bf01528181610121015261020b01526103586000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630d253d76146100515780633a5381b5146100805780635fbfb9cf146100a7578063bc10273e146100ba575b600080fd5b61006461005f3660046102a3565b6100e1565b6040516001600160a01b03909116815260200160405180910390f35b6100647f000000000000000000000000000000000000000000000000000000000000000081565b6100646100b53660046102a3565b6101cb565b6100647f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e6990610182907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b602060405180830381865afa15801561019f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c39190610334565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061026c907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b6020604051808303816000875af115801561019f573d6000803e3d6000fd5b6001600160a01b03811681146102a057600080fd5b50565b600080604083850312156102b657600080fd5b82356102c18161028b565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561030b578681018301518582016080015282016102ef565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561034657600080fd5b81516103518161028b565b9392505050560000000000000000000000002fac18d2d730355f84f3d08b4843397150a9622200000000000000000000000004b6041e532e81c91f28302e90204715d3245423", + "nonce": "0xe", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xca28197b3c9dc28bbe28690922e7e294c509326d951cd938184b6cbbd98ab03a", + "0xf2f00a8b448ee1f113a047411d9c8c35779b7d35f5c5335eddec78eadb29a0cc", + "0x00a1bad10995927a410e6fafc50eaa6f281787a2dd4902b41541aad34f9b872c" + ], + "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", + "returns": {}, + "timestamp": 1685034687, + "chain": 80001, + "multi": false, + "commit": "4a30d7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685034694.json b/broadcast/DeployKernel.s.sol/80001/run-1685034694.json new file mode 100644 index 00000000..46cc3005 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685034694.json @@ -0,0 +1,181 @@ +{ + "transactions": [ + { + "hash": "0xca28197b3c9dc28bbe28690922e7e294c509326d951cd938184b6cbbd98ab03a", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0x2FaC18D2d730355f84f3d08b4843397150a96222", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x34753d", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161312038038061312083398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b6127a48061097c83390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b6080516108956100e760003960008181604b0152818161010b0152818161021b015261026d01526108956000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063037637aa146100465780631bb12e6914610089578063296601cd1461009c575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006d6100973660046103b8565b6100af565b61006d6100aa3660046103b8565b6101bd565b600080858585856040516020016100c9949392919061044f565b6040516020818303038152906040528051906020012090506101b181604051806020016100f5906103ab565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000089898960405160240161013f939291906104a5565b60408051601f19818403018152918152602080830180516001600160e01b031663347d5e2560e21b1790529051610178939291016104f7565b60408051601f19818403018152908290526101969291602001610539565b6040516020818303038152906040528051906020012061036d565b9150505b949350505050565b600080858585856040516020016101d7949392919061044f565b604051602081830303815290604052805190602001209050600061024f8260405180602001610205906103ab565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a8a8a60405160240161013f939291906104a5565b90506001600160a01b0381163b1561026a5791506101b59050565b817f000000000000000000000000000000000000000000000000000000000000000063d1f5789460e01b8989896040516024016102a9939291906104a5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516102e6906103ab565b6102f19291906104f7565b8190604051809103906000f5905080158015610311573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f743788888860405161035b93929190610568565b60405180910390a35050949350505050565b600061037a838330610381565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061058d83390190565b600080600080606085870312156103ce57600080fd5b84356001600160a01b03811681146103e557600080fd5b9350602085013567ffffffffffffffff8082111561040257600080fd5b818701915087601f83011261041657600080fd5b81358181111561042557600080fd5b88602082850101111561043757600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082018190526000906104ca908301848661047c565b95945050505050565b60005b838110156104ee5781810151838201526020016104d6565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105248160608501602087016104d3565b601f01601f1916919091016060019392505050565b6000835161054b8184602088016104d3565b83519083019061055f8183602088016104d3565b01949350505050565b60408152600061057c60408301858761047c565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xA5A7035637487A0D83F9aC6283Cb553F5AA6F0b3", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xf2f00a8b448ee1f113a047411d9c8c35779b7d35f5c5335eddec78eadb29a0cc", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0x04b6041E532E81c91f28302E90204715d3245423", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x00a1bad10995927a410e6fafc50eaa6f281787a2dd4902b41541aad34f9b872c", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xd02669C9bA129211A615CE6829e30fe5a30793Ac", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4c1e6", + "value": "0x0", + "data": "0x60c060405234801561001057600080fd5b5060405161042f38038061042f83398101604081905261002f9161005e565b6001600160a01b039182166080521660a052610098565b6001600160a01b038116811461005b57600080fd5b50565b6000806040838503121561007157600080fd5b825161007c81610046565b602084015190925061008d81610046565b809150509250929050565b60805160a0516103586100d760003960008181608501528181610156015261024001526000818160bf01528181610121015261020b01526103586000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630d253d76146100515780633a5381b5146100805780635fbfb9cf146100a7578063bc10273e146100ba575b600080fd5b61006461005f3660046102a3565b6100e1565b6040516001600160a01b03909116815260200160405180910390f35b6100647f000000000000000000000000000000000000000000000000000000000000000081565b6100646100b53660046102a3565b6101cb565b6100647f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e6990610182907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b602060405180830381865afa15801561019f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c39190610334565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061026c907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b6020604051808303816000875af115801561019f573d6000803e3d6000fd5b6001600160a01b03811681146102a057600080fd5b50565b600080604083850312156102b657600080fd5b82356102c18161028b565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561030b578681018301518582016080015282016102ef565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561034657600080fd5b81516103518161028b565b9392505050560000000000000000000000002fac18d2d730355f84f3d08b4843397150a9622200000000000000000000000004b6041e532e81c91f28302e90204715d3245423", + "nonce": "0xe", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xca28197b3c9dc28bbe28690922e7e294c509326d951cd938184b6cbbd98ab03a", + "transactionIndex": "0xa", + "blockHash": "0x220348f84be8497f38155bdbf86ece68105f96a84ff61cd92ffbc9f0c9cae066", + "blockNumber": "0x225dd87", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x546ff8", + "gasUsed": "0x285a2f", + "contractAddress": "0x2FaC18D2d730355f84f3d08b4843397150a96222", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000012ca5dd6302ee100000000000000000000000000000000000000000000000009bb487a801ee8da000000000000000000000000000000000000000000001f78474ecf7ae66cd67000000000000000000000000000000000000000000000000009a87e1ca9eeb9f9000000000000000000000000000000000000000000001f78476199d8bc9d0551", + "blockHash": "0x220348f84be8497f38155bdbf86ece68105f96a84ff61cd92ffbc9f0c9cae066", + "blockNumber": "0x225dd87", + "transactionHash": "0xca28197b3c9dc28bbe28690922e7e294c509326d951cd938184b6cbbd98ab03a", + "transactionIndex": "0xa", + "logIndex": "0x4d", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xf2f00a8b448ee1f113a047411d9c8c35779b7d35f5c5335eddec78eadb29a0cc", + "transactionIndex": "0xb", + "blockHash": "0x220348f84be8497f38155bdbf86ece68105f96a84ff61cd92ffbc9f0c9cae066", + "blockNumber": "0x225dd87", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x5be92f", + "gasUsed": "0x77937", + "contractAddress": "0x04b6041E532E81c91f28302E90204715d3245423", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x00000000000000000000000000000000000000000000000000037ae8faf7bf5900000000000000000000000000000000000000000000000009a87e1ca740bcda000000000000000000000000000000000000000000001f78476199d8bc9d055100000000000000000000000000000000000000000000000009a50333ac48fd81000000000000000000000000000000000000000000001f78476514c1b794c4aa", + "blockHash": "0x220348f84be8497f38155bdbf86ece68105f96a84ff61cd92ffbc9f0c9cae066", + "blockNumber": "0x225dd87", + "transactionHash": "0xf2f00a8b448ee1f113a047411d9c8c35779b7d35f5c5335eddec78eadb29a0cc", + "transactionIndex": "0xb", + "logIndex": "0x4e", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x00a1bad10995927a410e6fafc50eaa6f281787a2dd4902b41541aad34f9b872c", + "transactionIndex": "0xc", + "blockHash": "0x220348f84be8497f38155bdbf86ece68105f96a84ff61cd92ffbc9f0c9cae066", + "blockNumber": "0x225dd87", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x5f9208", + "gasUsed": "0x3a8d9", + "contractAddress": "0xd02669C9bA129211A615CE6829e30fe5a30793Ac", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000001b440f14c3d9700000000000000000000000000000000000000000000000009a50333abc9f0da000000000000000000000000000000000000000000001f78476514c1b794c4aa00000000000000000000000000000000000000000000000009a34ef2ba7db343000000000000000000000000000000000000000000001f784766c902a8e10241", + "blockHash": "0x220348f84be8497f38155bdbf86ece68105f96a84ff61cd92ffbc9f0c9cae066", + "blockNumber": "0x225dd87", + "transactionHash": "0x00a1bad10995927a410e6fafc50eaa6f281787a2dd4902b41541aad34f9b872c", + "transactionIndex": "0xc", + "logIndex": "0x4f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", + "returns": {}, + "timestamp": 1685034694, + "chain": 80001, + "multi": false, + "commit": "4a30d7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685034801.json b/broadcast/DeployKernel.s.sol/80001/run-1685034801.json new file mode 100644 index 00000000..8a842dc7 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685034801.json @@ -0,0 +1,85 @@ +{ + "transactions": [ + { + "hash": "0x4de7d15051f0b55f9276698f72b630a74ce4e9e05a8efee91e4ccf13885cdd99", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0xbb2Fa81a7ec2dF9F109900aEc1F26EfD516F79AA", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x34753d", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161312038038061312083398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b6127a48061097c83390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b6080516108956100e760003960008181604b0152818161010b0152818161021b015261026d01526108956000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063037637aa146100465780631bb12e6914610089578063296601cd1461009c575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006d6100973660046103b8565b6100af565b61006d6100aa3660046103b8565b6101bd565b600080858585856040516020016100c9949392919061044f565b6040516020818303038152906040528051906020012090506101b181604051806020016100f5906103ab565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000089898960405160240161013f939291906104a5565b60408051601f19818403018152918152602080830180516001600160e01b031663347d5e2560e21b1790529051610178939291016104f7565b60408051601f19818403018152908290526101969291602001610539565b6040516020818303038152906040528051906020012061036d565b9150505b949350505050565b600080858585856040516020016101d7949392919061044f565b604051602081830303815290604052805190602001209050600061024f8260405180602001610205906103ab565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a8a8a60405160240161013f939291906104a5565b90506001600160a01b0381163b1561026a5791506101b59050565b817f000000000000000000000000000000000000000000000000000000000000000063d1f5789460e01b8989896040516024016102a9939291906104a5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516102e6906103ab565b6102f19291906104f7565b8190604051809103906000f5905080158015610311573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f743788888860405161035b93929190610568565b60405180910390a35050949350505050565b600061037a838330610381565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061058d83390190565b600080600080606085870312156103ce57600080fd5b84356001600160a01b03811681146103e557600080fd5b9350602085013567ffffffffffffffff8082111561040257600080fd5b818701915087601f83011261041657600080fd5b81358181111561042557600080fd5b88602082850101111561043757600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082018190526000906104ca908301848661047c565b95945050505050565b60005b838110156104ee5781810151838201526020016104d6565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105248160608501602087016104d3565b601f01601f1916919091016060019392505050565b6000835161054b8184602088016104d3565b83519083019061055f8183602088016104d3565b01949350505050565b60408152600061057c60408301858761047c565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xf", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xB2ACd56A7dDBe30aE327BADEe7e5B76F6027dF10", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x295ad534cc4cd86787f3adea7c7da526731c08f8cd22112138bb772745569c51", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0xf585511520094B0F0f17977811ca8DCC21c967F8", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x10", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x33cc3485b2544ae9f85999ed20da2a0ce82ea31fe6ff032b8a00747ee542bada", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xd0825067640fdebeeefF0e1696970143CCC5BD65", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4c1d7", + "value": "0x0", + "data": "0x60c060405234801561001057600080fd5b5060405161042f38038061042f83398101604081905261002f9161005e565b6001600160a01b039182166080521660a052610098565b6001600160a01b038116811461005b57600080fd5b50565b6000806040838503121561007157600080fd5b825161007c81610046565b602084015190925061008d81610046565b809150509250929050565b60805160a0516103586100d760003960008181608501528181610156015261024001526000818160bf01528181610121015261020b01526103586000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630d253d76146100515780633a5381b5146100805780635fbfb9cf146100a7578063bc10273e146100ba575b600080fd5b61006461005f3660046102a3565b6100e1565b6040516001600160a01b03909116815260200160405180910390f35b6100647f000000000000000000000000000000000000000000000000000000000000000081565b6100646100b53660046102a3565b6101cb565b6100647f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e6990610182907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b602060405180830381865afa15801561019f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c39190610334565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061026c907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b6020604051808303816000875af115801561019f573d6000803e3d6000fd5b6001600160a01b03811681146102a057600080fd5b50565b600080604083850312156102b657600080fd5b82356102c18161028b565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561030b578681018301518582016080015282016102ef565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561034657600080fd5b81516103518161028b565b939250505056000000000000000000000000bb2fa81a7ec2df9f109900aec1f26efd516f79aa000000000000000000000000f585511520094b0f0f17977811ca8dcc21c967f8", + "nonce": "0x11", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x4de7d15051f0b55f9276698f72b630a74ce4e9e05a8efee91e4ccf13885cdd99", + "0x295ad534cc4cd86787f3adea7c7da526731c08f8cd22112138bb772745569c51", + "0x33cc3485b2544ae9f85999ed20da2a0ce82ea31fe6ff032b8a00747ee542bada" + ], + "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", + "returns": {}, + "timestamp": 1685034801, + "chain": 80001, + "multi": false, + "commit": "4a30d7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685034808.json b/broadcast/DeployKernel.s.sol/80001/run-1685034808.json new file mode 100644 index 00000000..9fc19a64 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685034808.json @@ -0,0 +1,181 @@ +{ + "transactions": [ + { + "hash": "0x4de7d15051f0b55f9276698f72b630a74ce4e9e05a8efee91e4ccf13885cdd99", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0xbb2Fa81a7ec2dF9F109900aEc1F26EfD516F79AA", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x34753d", + "value": "0x0", + "data": "0x60a060405234801561001057600080fd5b5060405161312038038061312083398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b6127a48061097c83390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b6080516108956100e760003960008181604b0152818161010b0152818161021b015261026d01526108956000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063037637aa146100465780631bb12e6914610089578063296601cd1461009c575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006d6100973660046103b8565b6100af565b61006d6100aa3660046103b8565b6101bd565b600080858585856040516020016100c9949392919061044f565b6040516020818303038152906040528051906020012090506101b181604051806020016100f5906103ab565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000089898960405160240161013f939291906104a5565b60408051601f19818403018152918152602080830180516001600160e01b031663347d5e2560e21b1790529051610178939291016104f7565b60408051601f19818403018152908290526101969291602001610539565b6040516020818303038152906040528051906020012061036d565b9150505b949350505050565b600080858585856040516020016101d7949392919061044f565b604051602081830303815290604052805190602001209050600061024f8260405180602001610205906103ab565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a8a8a60405160240161013f939291906104a5565b90506001600160a01b0381163b1561026a5791506101b59050565b817f000000000000000000000000000000000000000000000000000000000000000063d1f5789460e01b8989896040516024016102a9939291906104a5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516102e6906103ab565b6102f19291906104f7565b8190604051809103906000f5905080158015610311573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f743788888860405161035b93929190610568565b60405180910390a35050949350505050565b600061037a838330610381565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061058d83390190565b600080600080606085870312156103ce57600080fd5b84356001600160a01b03811681146103e557600080fd5b9350602085013567ffffffffffffffff8082111561040257600080fd5b818701915087601f83011261041657600080fd5b81358181111561042557600080fd5b88602082850101111561043757600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082018190526000906104ca908301848661047c565b95945050505050565b60005b838110156104ee5781810151838201526020016104d6565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105248160608501602087016104d3565b601f01601f1916919091016060019392505050565b6000835161054b8184602088016104d3565b83519083019061055f8183602088016104d3565b01949350505050565b60408152600061057c60408301858761047c565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xf", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xB2ACd56A7dDBe30aE327BADEe7e5B76F6027dF10", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x295ad534cc4cd86787f3adea7c7da526731c08f8cd22112138bb772745569c51", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0xf585511520094B0F0f17977811ca8DCC21c967F8", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x10", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x33cc3485b2544ae9f85999ed20da2a0ce82ea31fe6ff032b8a00747ee542bada", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xd0825067640fdebeeefF0e1696970143CCC5BD65", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4c1d7", + "value": "0x0", + "data": "0x60c060405234801561001057600080fd5b5060405161042f38038061042f83398101604081905261002f9161005e565b6001600160a01b039182166080521660a052610098565b6001600160a01b038116811461005b57600080fd5b50565b6000806040838503121561007157600080fd5b825161007c81610046565b602084015190925061008d81610046565b809150509250929050565b60805160a0516103586100d760003960008181608501528181610156015261024001526000818160bf01528181610121015261020b01526103586000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630d253d76146100515780633a5381b5146100805780635fbfb9cf146100a7578063bc10273e146100ba575b600080fd5b61006461005f3660046102a3565b6100e1565b6040516001600160a01b03909116815260200160405180910390f35b6100647f000000000000000000000000000000000000000000000000000000000000000081565b6100646100b53660046102a3565b6101cb565b6100647f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e6990610182907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b602060405180830381865afa15801561019f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c39190610334565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061026c907f000000000000000000000000000000000000000000000000000000000000000090859088906038016102cf565b6020604051808303816000875af115801561019f573d6000803e3d6000fd5b6001600160a01b03811681146102a057600080fd5b50565b600080604083850312156102b657600080fd5b82356102c18161028b565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561030b578681018301518582016080015282016102ef565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561034657600080fd5b81516103518161028b565b939250505056000000000000000000000000bb2fa81a7ec2df9f109900aec1f26efd516f79aa000000000000000000000000f585511520094b0f0f17977811ca8dcc21c967f8", + "nonce": "0x11", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x4de7d15051f0b55f9276698f72b630a74ce4e9e05a8efee91e4ccf13885cdd99", + "transactionIndex": "0x8", + "blockHash": "0xb4eeeca3173a4ee3b83cef92c9900b11052070a0b50342117122c113729399be", + "blockNumber": "0x225ddbd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x4bb97f", + "gasUsed": "0x285a2f", + "contractAddress": "0xbb2Fa81a7ec2dF9F109900aEc1F26EfD516F79AA", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x000000000000000000000000000000000000000000000000001c2f8cc29f44e100000000000000000000000000000000000000000000000009a34ef2ba3f7cda0000000000000000000000000000000000000000000010fd4b055cf99fa086ab00000000000000000000000000000000000000000000000009871f65f7a037f90000000000000000000000000000000000000000000010fd4b218c86623fcb8c", + "blockHash": "0xb4eeeca3173a4ee3b83cef92c9900b11052070a0b50342117122c113729399be", + "blockNumber": "0x225ddbd", + "transactionHash": "0x4de7d15051f0b55f9276698f72b630a74ce4e9e05a8efee91e4ccf13885cdd99", + "transactionIndex": "0x8", + "logIndex": "0x3a", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e00" + }, + { + "transactionHash": "0x295ad534cc4cd86787f3adea7c7da526731c08f8cd22112138bb772745569c51", + "transactionIndex": "0x9", + "blockHash": "0xb4eeeca3173a4ee3b83cef92c9900b11052070a0b50342117122c113729399be", + "blockNumber": "0x225ddbd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x5332b6", + "gasUsed": "0x77937", + "contractAddress": "0xf585511520094B0F0f17977811ca8DCC21c967F8", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x0000000000000000000000000000000000000000000000000005385d78b3255900000000000000000000000000000000000000000000000009871f65f4f23ada0000000000000000000000000000000000000000000010fd4b218c86623fcb8c0000000000000000000000000000000000000000000000000981e7087c3f15810000000000000000000000000000000000000000000010fd4b26c4e3daf2f0e5", + "blockHash": "0xb4eeeca3173a4ee3b83cef92c9900b11052070a0b50342117122c113729399be", + "blockNumber": "0x225ddbd", + "transactionHash": "0x295ad534cc4cd86787f3adea7c7da526731c08f8cd22112138bb772745569c51", + "transactionIndex": "0x9", + "logIndex": "0x3b", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e00" + }, + { + "transactionHash": "0x33cc3485b2544ae9f85999ed20da2a0ce82ea31fe6ff032b8a00747ee542bada", + "transactionIndex": "0xa", + "blockHash": "0xb4eeeca3173a4ee3b83cef92c9900b11052070a0b50342117122c113729399be", + "blockNumber": "0x225ddbd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x56db83", + "gasUsed": "0x3a8cd", + "contractAddress": "0xd0825067640fdebeeefF0e1696970143CCC5BD65", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000028e59084d10630000000000000000000000000000000000000000000000000981e7087bc008da0000000000000000000000000000000000000000000010fd4b26c4e3daf2f0e5000000000000000000000000000000000000000000000000097f58af7372f8770000000000000000000000000000000000000000000010fd4b29533ce3400148", + "blockHash": "0xb4eeeca3173a4ee3b83cef92c9900b11052070a0b50342117122c113729399be", + "blockNumber": "0x225ddbd", + "transactionHash": "0x33cc3485b2544ae9f85999ed20da2a0ce82ea31fe6ff032b8a00747ee542bada", + "transactionIndex": "0xa", + "logIndex": "0x3c", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e00" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", + "returns": {}, + "timestamp": 1685034808, + "chain": 80001, + "multi": false, + "commit": "4a30d7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685041894.json b/broadcast/DeployKernel.s.sol/80001/run-1685041894.json new file mode 100644 index 00000000..dd67d3a8 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685041894.json @@ -0,0 +1,133 @@ +{ + "transactions": [ + { + "hash": "0x3d8211bb5d80f6c392775cfe2b8682e6487924224adf9ddc0c0d2a2f34573869", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0x535236cC4d28CCEdCe0Bd7F0De448544dB99A12d", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x39b847", + "value": "0x0", + "data": "0x60c060405234801561001057600080fd5b506040516135c73803806135c783398101604081905261002f9161009f565b8060405161003c90610092565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b039081166080521660a052600080546001600160a01b031916331790556100cf565b6127a480610e2383390190565b6000602082840312156100b157600080fd5b81516001600160a01b03811681146100c857600080fd5b9392505050565b60805160a051610d0661011d600039600081816101a6015281816102550152818161061a01526106db01526000818160aa015281816103210152818161043d01526104930152610d066000f3fe608060405260043610620000915760003560e01c80635ebaf1db11620000605780635ebaf1db146200014b578063a29a43bb146200016d578063b0d691fe1462000192578063bb9fe6bf14620001c8578063c23a5cea14620001e057600080fd5b8063037637aa14620000965780630396cb6014620000e85780631bb12e691462000101578063296601cd1462000126575b600080fd5b348015620000a357600080fd5b50620000cc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b620000ff620000f93660046200078a565b62000205565b005b3480156200010e57600080fd5b50620000cc62000120366004620007cb565b620002c0565b3480156200013357600080fd5b50620000cc62000145366004620007cb565b620003da565b3480156200015857600080fd5b50600054620000cc906001600160a01b031681565b3480156200017a57600080fd5b50620000ff6200018c3660046200085d565b6200059c565b3480156200019f57600080fd5b50620000cc7f000000000000000000000000000000000000000000000000000000000000000081565b348015620001d557600080fd5b50620000ff620005eb565b348015620001ed57600080fd5b50620000ff620001ff3660046200085d565b6200068f565b6000546001600160a01b031633146200023b5760405162461bcd60e51b815260040162000232906200087d565b60405180910390fd5b604051621cb65b60e51b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b158015620002a357600080fd5b505af1158015620002b8573d6000803e3d6000fd5b505050505050565b60008085858585604051602001620002dc9493929190620008b4565b604051602081830303815290604052805190602001209050620003ce81604051806020016200030b906200077c565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000089898960405160240162000357939291906200090a565b60408051601f19818403018152918152602080830180516001600160e01b031663347d5e2560e21b1790529051620003929392910162000960565b60408051601f1981840301815290829052620003b29291602001620009a4565b604051602081830303815290604052805190602001206200073c565b9150505b949350505050565b60008085858585604051602001620003f69493929190620008b4565b604051602081830303815290604052805190602001209050600062000473826040518060200162000427906200077c565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a8a8a60405160240162000357939291906200090a565b90506001600160a01b0381163b1562000490579150620003d29050565b817f000000000000000000000000000000000000000000000000000000000000000063d1f5789460e01b898989604051602401620004d1939291906200090a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905162000510906200077c565b6200051d92919062000960565b8190604051809103906000f59050801580156200053e573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516200058a93929190620009d7565b60405180910390a35050949350505050565b6000546001600160a01b03163314620005c95760405162461bcd60e51b815260040162000232906200087d565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314620006185760405162461bcd60e51b815260040162000232906200087d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200067457600080fd5b505af115801562000689573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314620006bc5760405162461bcd60e51b815260040162000232906200087d565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156200072057600080fd5b505af115801562000735573d6000803e3d6000fd5b5050505050565b60006200074b83833062000752565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61030880620009fe83390190565b6000602082840312156200079d57600080fd5b813563ffffffff811681146200074b57600080fd5b6001600160a01b0381168114620007c857600080fd5b50565b60008060008060608587031215620007e257600080fd5b8435620007ef81620007b2565b9350602085013567ffffffffffffffff808211156200080d57600080fd5b818701915087601f8301126200082257600080fd5b8135818111156200083257600080fd5b8860208285010111156200084557600080fd5b95986020929092019750949560400135945092505050565b6000602082840312156200087057600080fd5b81356200074b81620007b2565b60208082526018908201527f4b65726e656c466163746f72793a20666f7262696464656e0000000000000000604082015260600190565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0384168152604060208201819052600090620009319083018486620008e1565b95945050505050565b60005b83811015620009575781810151838201526020016200093d565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526200098f8160608501602087016200093a565b601f01601f1916919091016060019392505050565b60008351620009b88184602088016200093a565b835190830190620009ce8183602088016200093a565b01949350505050565b604081526000620009ed604083018587620008e1565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x12", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x8D4638C1aE859b6856cA979C3Ff4D3A646c0E4F9", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x535236cC4d28CCEdCe0Bd7F0De448544dB99A12d", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x535236cc4d28ccedce0bd7f0de448544db99a12d", + "gas": "0x1b507", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x13", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd452e01c2b11b15b29cc2f331c1e316962656aeee25eb91fca63a230dee893e9", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0x2CBa7d77c93C0d595A73e2868F8F8292FcA0cb92", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x14", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaf4c997019ae384ca32e7c74e56383df9b8c26b725303e4222c4fda8feaeb1a7", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x6B337f4dDB17B4ba93BCdE99661aB46AEc1D2823", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x98e0b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161087438038061087483398101604081905261002f91610076565b6001600160a01b0392831660805290821660a0521660c052600080546001600160a01b031916331790556100c3565b6001600160a01b038116811461007357600080fd5b50565b60008060006060848603121561008b57600080fd5b83516100968161005e565b60208501519093506100a78161005e565b60408501519092506100b88161005e565b809150509250925092565b60805160a05160c0516107526101226000396000818161018d01528181610265015281816104f001526105ac01526000818160f901528181610343015261042d0152600081816101d60152818161030e01526103f801526107526000f3fe6080604052600436106100915760003560e01c8063a29a43bb11610059578063a29a43bb1461015b578063b0d691fe1461017b578063bb9fe6bf146101af578063bc10273e146101c4578063c23a5cea146101f857600080fd5b80630396cb60146100965780630d253d76146100ab5780633a5381b5146100e75780635ebaf1db1461011b5780635fbfb9cf1461013b575b600080fd5b6100a96100a436600461060b565b610218565b005b3480156100b757600080fd5b506100cb6100c6366004610650565b6102ce565b6040516001600160a01b03909116815260200160405180910390f35b3480156100f357600080fd5b506100cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561012757600080fd5b506000546100cb906001600160a01b031681565b34801561014757600080fd5b506100cb610156366004610650565b6103b8565b34801561016757600080fd5b506100a961017636600461067c565b610478565b34801561018757600080fd5b506100cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101bb57600080fd5b506100a96104c4565b3480156101d057600080fd5b506100cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561020457600080fd5b506100a961021336600461067c565b610563565b6000546001600160a01b0316331461024b5760405162461bcd60e51b815260040161024290610699565b60405180910390fd5b604051621cb65b60e51b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b1580156102b257600080fd5b505af11580156102c6573d6000803e3d6000fd5b505050505050565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e699061036f907f000000000000000000000000000000000000000000000000000000000000000090859088906038016106d0565b602060405180830381865afa15801561038c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b09190610735565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd90610459907f000000000000000000000000000000000000000000000000000000000000000090859088906038016106d0565b6020604051808303816000875af115801561038c573d6000803e3d6000fd5b6000546001600160a01b031633146104a25760405162461bcd60e51b815260040161024290610699565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146104ee5760405162461bcd60e51b815260040161024290610699565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561054957600080fd5b505af115801561055d573d6000803e3d6000fd5b50505050565b6000546001600160a01b0316331461058d5760405162461bcd60e51b815260040161024290610699565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156105f057600080fd5b505af1158015610604573d6000803e3d6000fd5b5050505050565b60006020828403121561061d57600080fd5b813563ffffffff8116811461063157600080fd5b9392505050565b6001600160a01b038116811461064d57600080fd5b50565b6000806040838503121561066357600080fd5b823561066e81610638565b946020939093013593505050565b60006020828403121561068e57600080fd5b813561063181610638565b6020808252601d908201527f45434453414b65726e656c466163746f72793a20666f7262696464656e000000604082015260600190565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561070c578681018301518582016080015282016106f0565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561074757600080fd5b81516106318161063856000000000000000000000000535236cc4d28ccedce0bd7f0de448544db99a12d0000000000000000000000002cba7d77c93c0d595a73e2868f8f8292fca0cb920000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x15", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x6B337f4dDB17B4ba93BCdE99661aB46AEc1D2823", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x6b337f4ddb17b4ba93bcde99661ab46aec1d2823", + "gas": "0x1ce9c", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x16", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x3d8211bb5d80f6c392775cfe2b8682e6487924224adf9ddc0c0d2a2f34573869", + "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "0xd452e01c2b11b15b29cc2f331c1e316962656aeee25eb91fca63a230dee893e9", + "0xaf4c997019ae384ca32e7c74e56383df9b8c26b725303e4222c4fda8feaeb1a7", + "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778" + ], + "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", + "returns": {}, + "timestamp": 1685041894, + "chain": 80001, + "multi": false, + "commit": "4a30d7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685041901.json b/broadcast/DeployKernel.s.sol/80001/run-1685041901.json new file mode 100644 index 00000000..18ae850b --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685041901.json @@ -0,0 +1,385 @@ +{ + "transactions": [ + { + "hash": "0x3d8211bb5d80f6c392775cfe2b8682e6487924224adf9ddc0c0d2a2f34573869", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0x535236cC4d28CCEdCe0Bd7F0De448544dB99A12d", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x39b847", + "value": "0x0", + "data": "0x60c060405234801561001057600080fd5b506040516135c73803806135c783398101604081905261002f9161009f565b8060405161003c90610092565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b039081166080521660a052600080546001600160a01b031916331790556100cf565b6127a480610e2383390190565b6000602082840312156100b157600080fd5b81516001600160a01b03811681146100c857600080fd5b9392505050565b60805160a051610d0661011d600039600081816101a6015281816102550152818161061a01526106db01526000818160aa015281816103210152818161043d01526104930152610d066000f3fe608060405260043610620000915760003560e01c80635ebaf1db11620000605780635ebaf1db146200014b578063a29a43bb146200016d578063b0d691fe1462000192578063bb9fe6bf14620001c8578063c23a5cea14620001e057600080fd5b8063037637aa14620000965780630396cb6014620000e85780631bb12e691462000101578063296601cd1462000126575b600080fd5b348015620000a357600080fd5b50620000cc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b620000ff620000f93660046200078a565b62000205565b005b3480156200010e57600080fd5b50620000cc62000120366004620007cb565b620002c0565b3480156200013357600080fd5b50620000cc62000145366004620007cb565b620003da565b3480156200015857600080fd5b50600054620000cc906001600160a01b031681565b3480156200017a57600080fd5b50620000ff6200018c3660046200085d565b6200059c565b3480156200019f57600080fd5b50620000cc7f000000000000000000000000000000000000000000000000000000000000000081565b348015620001d557600080fd5b50620000ff620005eb565b348015620001ed57600080fd5b50620000ff620001ff3660046200085d565b6200068f565b6000546001600160a01b031633146200023b5760405162461bcd60e51b815260040162000232906200087d565b60405180910390fd5b604051621cb65b60e51b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b158015620002a357600080fd5b505af1158015620002b8573d6000803e3d6000fd5b505050505050565b60008085858585604051602001620002dc9493929190620008b4565b604051602081830303815290604052805190602001209050620003ce81604051806020016200030b906200077c565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000089898960405160240162000357939291906200090a565b60408051601f19818403018152918152602080830180516001600160e01b031663347d5e2560e21b1790529051620003929392910162000960565b60408051601f1981840301815290829052620003b29291602001620009a4565b604051602081830303815290604052805190602001206200073c565b9150505b949350505050565b60008085858585604051602001620003f69493929190620008b4565b604051602081830303815290604052805190602001209050600062000473826040518060200162000427906200077c565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a8a8a60405160240162000357939291906200090a565b90506001600160a01b0381163b1562000490579150620003d29050565b817f000000000000000000000000000000000000000000000000000000000000000063d1f5789460e01b898989604051602401620004d1939291906200090a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905162000510906200077c565b6200051d92919062000960565b8190604051809103906000f59050801580156200053e573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516200058a93929190620009d7565b60405180910390a35050949350505050565b6000546001600160a01b03163314620005c95760405162461bcd60e51b815260040162000232906200087d565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314620006185760405162461bcd60e51b815260040162000232906200087d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200067457600080fd5b505af115801562000689573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314620006bc5760405162461bcd60e51b815260040162000232906200087d565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156200072057600080fd5b505af115801562000735573d6000803e3d6000fd5b5050505050565b60006200074b83833062000752565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61030880620009fe83390190565b6000602082840312156200079d57600080fd5b813563ffffffff811681146200074b57600080fd5b6001600160a01b0381168114620007c857600080fd5b50565b60008060008060608587031215620007e257600080fd5b8435620007ef81620007b2565b9350602085013567ffffffffffffffff808211156200080d57600080fd5b818701915087601f8301126200082257600080fd5b8135818111156200083257600080fd5b8860208285010111156200084557600080fd5b95986020929092019750949560400135945092505050565b6000602082840312156200087057600080fd5b81356200074b81620007b2565b60208082526018908201527f4b65726e656c466163746f72793a20666f7262696464656e0000000000000000604082015260600190565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0384168152604060208201819052600090620009319083018486620008e1565b95945050505050565b60005b83811015620009575781810151838201526020016200093d565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526200098f8160608501602087016200093a565b601f01601f1916919091016060019392505050565b60008351620009b88184602088016200093a565b835190830190620009ce8183602088016200093a565b01949350505050565b604081526000620009ed604083018587620008e1565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x12", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x8D4638C1aE859b6856cA979C3Ff4D3A646c0E4F9", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x535236cC4d28CCEdCe0Bd7F0De448544dB99A12d", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x535236cc4d28ccedce0bd7f0de448544db99a12d", + "gas": "0x1b507", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x13", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd452e01c2b11b15b29cc2f331c1e316962656aeee25eb91fca63a230dee893e9", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0x2CBa7d77c93C0d595A73e2868F8F8292FcA0cb92", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x14", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaf4c997019ae384ca32e7c74e56383df9b8c26b725303e4222c4fda8feaeb1a7", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x6B337f4dDB17B4ba93BCdE99661aB46AEc1D2823", + "function": null, + "arguments": null, + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x98e0b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161087438038061087483398101604081905261002f91610076565b6001600160a01b0392831660805290821660a0521660c052600080546001600160a01b031916331790556100c3565b6001600160a01b038116811461007357600080fd5b50565b60008060006060848603121561008b57600080fd5b83516100968161005e565b60208501519093506100a78161005e565b60408501519092506100b88161005e565b809150509250925092565b60805160a05160c0516107526101226000396000818161018d01528181610265015281816104f001526105ac01526000818160f901528181610343015261042d0152600081816101d60152818161030e01526103f801526107526000f3fe6080604052600436106100915760003560e01c8063a29a43bb11610059578063a29a43bb1461015b578063b0d691fe1461017b578063bb9fe6bf146101af578063bc10273e146101c4578063c23a5cea146101f857600080fd5b80630396cb60146100965780630d253d76146100ab5780633a5381b5146100e75780635ebaf1db1461011b5780635fbfb9cf1461013b575b600080fd5b6100a96100a436600461060b565b610218565b005b3480156100b757600080fd5b506100cb6100c6366004610650565b6102ce565b6040516001600160a01b03909116815260200160405180910390f35b3480156100f357600080fd5b506100cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561012757600080fd5b506000546100cb906001600160a01b031681565b34801561014757600080fd5b506100cb610156366004610650565b6103b8565b34801561016757600080fd5b506100a961017636600461067c565b610478565b34801561018757600080fd5b506100cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101bb57600080fd5b506100a96104c4565b3480156101d057600080fd5b506100cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561020457600080fd5b506100a961021336600461067c565b610563565b6000546001600160a01b0316331461024b5760405162461bcd60e51b815260040161024290610699565b60405180910390fd5b604051621cb65b60e51b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b1580156102b257600080fd5b505af11580156102c6573d6000803e3d6000fd5b505050505050565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e699061036f907f000000000000000000000000000000000000000000000000000000000000000090859088906038016106d0565b602060405180830381865afa15801561038c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b09190610735565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd90610459907f000000000000000000000000000000000000000000000000000000000000000090859088906038016106d0565b6020604051808303816000875af115801561038c573d6000803e3d6000fd5b6000546001600160a01b031633146104a25760405162461bcd60e51b815260040161024290610699565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146104ee5760405162461bcd60e51b815260040161024290610699565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561054957600080fd5b505af115801561055d573d6000803e3d6000fd5b50505050565b6000546001600160a01b0316331461058d5760405162461bcd60e51b815260040161024290610699565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b1580156105f057600080fd5b505af1158015610604573d6000803e3d6000fd5b5050505050565b60006020828403121561061d57600080fd5b813563ffffffff8116811461063157600080fd5b9392505050565b6001600160a01b038116811461064d57600080fd5b50565b6000806040838503121561066357600080fd5b823561066e81610638565b946020939093013593505050565b60006020828403121561068e57600080fd5b813561063181610638565b6020808252601d908201527f45434453414b65726e656c466163746f72793a20666f7262696464656e000000604082015260600190565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561070c578681018301518582016080015282016106f0565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561074757600080fd5b81516106318161063856000000000000000000000000535236cc4d28ccedce0bd7f0de448544db99a12d0000000000000000000000002cba7d77c93c0d595a73e2868f8f8292fca0cb920000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x15", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x6B337f4dDB17B4ba93BCdE99661aB46AEc1D2823", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x6b337f4ddb17b4ba93bcde99661ab46aec1d2823", + "gas": "0x1ce9c", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x16", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x3d8211bb5d80f6c392775cfe2b8682e6487924224adf9ddc0c0d2a2f34573869", + "transactionIndex": "0x2", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x2e84aa", + "gasUsed": "0x2c665e", + "contractAddress": "0x535236cC4d28CCEdCe0Bd7F0De448544dB99A12d", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000014ace08bb18bc2000000000000000000000000000000000000000000000000097f58af7334c2da000000000000000000000000000000000000000000001f792630b58b9b38995c000000000000000000000000000000000000000000000000096aabcee7833718000000000000000000000000000000000000000000001f792645626c26ea251e", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0x3d8211bb5d80f6c392775cfe2b8682e6487924224adf9ddc0c0d2a2f34573869", + "transactionIndex": "0x2", + "logIndex": "0x4", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "transactionIndex": "0x3", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x535236cC4d28CCEdCe0Bd7F0De448544dB99A12d", + "cumulativeGasUsed": "0x2fc111", + "gasUsed": "0x13c67", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000535236cc4d28ccedce0bd7f0de448544db99a12d" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000969e04d2c755eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000969e04d2c755ed90000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "transactionIndex": "0x3", + "logIndex": "0x5", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000535236cc4d28ccedce0bd7f0de448544db99a12d", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000667a83d635af46777b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000667a83d635af46777c", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "transactionIndex": "0x3", + "logIndex": "0x6", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x000000000000000000000000535236cc4d28ccedce0bd7f0de448544db99a12d" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "transactionIndex": "0x3", + "logIndex": "0x7", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000000935619298929000000000000000000000000000000000000000000000000096aabcee4906ada000000000000000000000000000000000000000000001f792645626c26ea251e000000000000000000000000000000000000000000000000096a1878cb66e1b1000000000000000000000000000000000000000000001f792645f5c24013ae47", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0xc96169d68912bcc44c3bf8e945c55a17b2ee24e61c6688340bdb1246a4cc8d4c", + "transactionIndex": "0x3", + "logIndex": "0x8", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000200000000020000000000000000000000000000000000000000000000000000000000000000000200100000000000108000000020000000000000000000000000000000000000000000000000800000000000000000000100000001000200000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000002000000004000000000000000000001000000000000000040000000800000108000000000000100000000000000000000000000000000000200000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xd452e01c2b11b15b29cc2f331c1e316962656aeee25eb91fca63a230dee893e9", + "transactionIndex": "0x4", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x373a48", + "gasUsed": "0x77937", + "contractAddress": "0x2CBa7d77c93C0d595A73e2868F8F8292FcA0cb92", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x00000000000000000000000000000000000000000000000000037ae8faf7bf59000000000000000000000000000000000000000000000000096a1878cb51ded9000000000000000000000000000000000000000000001f792645f5c24013ae4700000000000000000000000000000000000000000000000009669d8fd05a1f80000000000000000000000000000000000000000000001f79264970ab3b0b6da0", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0xd452e01c2b11b15b29cc2f331c1e316962656aeee25eb91fca63a230dee893e9", + "transactionIndex": "0x4", + "logIndex": "0x9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xaf4c997019ae384ca32e7c74e56383df9b8c26b725303e4222c4fda8feaeb1a7", + "transactionIndex": "0x5", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x3e93db", + "gasUsed": "0x75993", + "contractAddress": "0x6B337f4dDB17B4ba93BCdE99661aB46AEc1D2823", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x00000000000000000000000000000000000000000000000000036c2d1fbb093d00000000000000000000000000000000000000000000000009669d8fcfdb12d9000000000000000000000000000000000000000000001f79264970ab3b0b6da000000000000000000000000000000000000000000000000009633162b020099c000000000000000000000000000000000000000000001f79264cdcd85ac676dd", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0xaf4c997019ae384ca32e7c74e56383df9b8c26b725303e4222c4fda8feaeb1a7", + "transactionIndex": "0x5", + "logIndex": "0xa", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778", + "transactionIndex": "0x6", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x6B337f4dDB17B4ba93BCdE99661aB46AEc1D2823", + "cumulativeGasUsed": "0x3fd02c", + "gasUsed": "0x13c51", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000006b337f4ddb17b4ba93bcde99661ab46aec1d2823" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000096259f759e4e6d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096259f759e4e6d80000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778", + "transactionIndex": "0x6", + "logIndex": "0xb", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000006b337f4ddb17b4ba93bcde99661ab46aec1d2823", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000667a83d635af46777c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000667a83d635af46777d", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778", + "transactionIndex": "0x6", + "logIndex": "0xc", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000006b337f4ddb17b4ba93bcde99661ab46aec1d2823" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778", + "transactionIndex": "0x6", + "logIndex": "0xd", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000000934bda8ed29f00000000000000000000000000000000000000000000000009633162afa316d9000000000000000000000000000000000000000000001f79264cdcd85ac676dd00000000000000000000000000000000000000000000000009629e16d514443a000000000000000000000000000000000000000000001f79264d70243555497c", + "blockHash": "0xd5c48b9f8148cc185a2483c411880d767d1b9d58867fe3c9da49ee425226f014", + "blockNumber": "0x225eac6", + "transactionHash": "0x8163e6a3cc6ea8ce4a264abdede7d7c01ded469e66d2a3e0e0a2786479bc8778", + "transactionIndex": "0x6", + "logIndex": "0xe", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000008000000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000080000000000000000000000000000000000004080800000000000000000000000000000000000020000000000000000000000000000080000008000201000000000000020000000000000000001000000000000000002000000004000000000000000000001000000000000000040000000800000108000000000000100000000000000000000000000000000000200000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", + "returns": {}, + "timestamp": 1685041901, + "chain": 80001, + "multi": false, + "commit": "4a30d7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685274646.json b/broadcast/DeployKernel.s.sol/80001/run-1685274646.json new file mode 100644 index 00000000..c72f9f36 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685274646.json @@ -0,0 +1,86 @@ +{ + "transactions": [ + { + "hash": "0xa1fb360440c7b5399f3afba03839a5165ad8308525d4f7d3fe756742c8f390f2", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0x8646Ba75541866a33bfd6575C18915E498d0aaF5", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x52b50b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614df5380380614df583398101604081905261002f916100f3565b8060405161003c906100d9565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100e6565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052600080546001600160a01b03191633179055610123565b611b6280610aef83390190565b6127a48061265183390190565b60006020828403121561010557600080fd5b81516001600160a01b038116811461011c57600080fd5b9392505050565b60805160a05160c05161097561017a600039600061010f01526000818160e8015281816101af015281816102e10152610355015260008181606c0152818161018d015281816102bf015261033301526109756000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063037637aa146100675780631bb12e69146100aa578063296601cd146100bd5780635ebaf1db146100d05780636c2f70fd146100e3578063b0d691fe1461010a575b600080fd5b61008e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61008e6100b836600461048f565b610131565b61008e6100cb36600461048f565b610261565b60005461008e906001600160a01b031681565b61008e7f000000000000000000000000000000000000000000000000000000000000000081565b61008e7f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161014b9493929190610526565b604051602081830303815290604052805190602001209050610255816040518060200161017790610482565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101e3949392919061057c565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b179052905161021c939291016105d7565b60408051601f198184030181529082905261023a9291602001610619565b60405160208183030381529060405280519060200120610444565b9150505b949350505050565b6000808585858560405160200161027b9493929190610526565b604051602081830303815290604052805190602001209050600061031582604051806020016102a990610482565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101e3949392919061057c565b90506001600160a01b0381163b156103305791506102599050565b817f0000000000000000000000000000000000000000000000000000000000000000887f00000000000000000000000000000000000000000000000000000000000000008989604051602401610389949392919061057c565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b179052516103bd90610482565b6103c89291906105d7565b8190604051809103906000f59050801580156103e8573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f743788888860405161043293929190610648565b60405180910390a35050949350505050565b6000610451838330610458565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061066d83390190565b600080600080606085870312156104a557600080fd5b84356001600160a01b03811681146104bc57600080fd5b9350602085013567ffffffffffffffff808211156104d957600080fd5b818701915087601f8301126104ed57600080fd5b8135818111156104fc57600080fd5b88602082850101111561050e57600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038581168252841660208201526060604082018190526000906105a99083018486610553565b9695505050505050565b60005b838110156105ce5781810151838201526020016105b6565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526106048160608501602087016105b3565b601f01601f1916919091016060019392505050565b6000835161062b8184602088016105b3565b83519083019061063f8183602088016105b3565b01949350505050565b60408152600061065c604083018587610553565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b62380380611b6283398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119a16101c160003960008181610347015261050c01526000611085015260006110d4015260006110af01526000611008015260006110320152600061105c01526119a16000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161115c565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161115c565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c29291906111e7565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061123d565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061123d565b60405180910390f35b34801561028657600080fd5b5061029a610295366004611299565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce3660046112e5565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b604051610271929190611339565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c36600461138d565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611408565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611444565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611467565b9050600061047482610a97565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b6000610589610140860186611480565b610598916004916000916114c7565b6105a1916114f1565b905060006105ae866115ee565b90506000806105c06060890189611480565b6105cf916004916000916114c7565b6105d8916114f1565b90506001600160e01b03198416600003610670576105f5886115ee565b9250610605610140890189611480565b6106139160049082906114c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a057610693610140890189611480565b6106a2916024916010916114c7565b6106ab916116fd565b60601c915036600081816106cc856106c76101408f018f611480565b610b08565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611730565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611744565b915050610842868280602001905181019061083d9190611467565b610f12565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611122565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611122565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d4919083611881565b5060006109f686630c95955660e01b8686604051602401610417929190611730565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909590945092505050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610ad3575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b1d60586038898b6114c7565b610b2691611942565b905087605888610b368483611960565b92610b43939291906114c7565b909550935060008888610b57846058611960565b90610b63856078611960565b92610b70939291906114c7565b610b7991611942565b60001c90506000610c5a7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bb9939291906114c7565b610bc291611942565b60001c8d8d602490603892610bd9939291906114c7565b610be2916116fd565b60601c8b8b604051610bf59291906111e7565b604051908190038120610c3f95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fad565b90506000610cc9610c696103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c938a6078611960565b9089610ca08c6078611960565b610caa9190611960565b92610cb7939291906114c7565b60405160240161041793929190611444565b915050610d1981806020019051810190610ce39190611467565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d0a939291906114c7565b610d1391611942565b16610f12565b98508a8a84610d29876078611960565b610d339190611960565b610d3e9282906114c7565b9550955060405180608001604052808c8c600490600a92610d61939291906114c7565b610d6a91611973565b60d01c65ffffffffffff1681526020018c8c600a90601092610d8e939291906114c7565b610d9791611973565b60d01c65ffffffffffff1681526020018c8c602490603892610dbb939291906114c7565b610dc4916116fd565b60601c6001600160a01b031681526020018c8c601090602492610de9939291906114c7565b610df2916116fd565b60601c9052610dff6103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610eaa602460108c8e6114c7565b610eb3916116fd565b60013090810180546001600160a01b03191660609390931c92909217909155600301610ee0888a83611881565b50888b60588c610ef08883611960565b92610efd939291906114c7565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f35575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f5f578193505b8065ffffffffffff168365ffffffffffff161115610f7b578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fba610ffb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561105457507f000000000000000000000000000000000000000000000000000000000000000046145b1561107e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061113657607f821691505b60208210810361115657634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461117081611122565b8084870152604060018084166000811461119157600181146111ab576111d9565b60ff1985168984015283151560051b8901830195506111d9565b896000528660002060005b858110156111d15781548b82018601529083019088016111b6565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561121d57602081850181015186830182015201611201565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f860208301846111f7565b60008083601f84011261126257600080fd5b50813567ffffffffffffffff81111561127a57600080fd5b60208301915083602082850101111561129257600080fd5b9250929050565b6000806000604084860312156112ae57600080fd5b83359250602084013567ffffffffffffffff8111156112cc57600080fd5b6112d886828701611250565b9497909650939450505050565b6000806000606084860312156112fa57600080fd5b833567ffffffffffffffff81111561131157600080fd5b8401610160818703121561132457600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061135d908301846111f7565b949350505050565b6001600160a01b038116811461137a57600080fd5b50565b803561138881611365565b919050565b600080600080606085870312156113a357600080fd5b84356113ae81611365565b935060208501356113be81611365565b9250604085013567ffffffffffffffff8111156113da57600080fd5b6113e687828801611250565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf6113f2565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061145e60408301848661141b565b95945050505050565b60006020828403121561147957600080fd5b5051919050565b6000808335601e1984360301811261149757600080fd5b83018035915067ffffffffffffffff8211156114b257600080fd5b60200191503681900382131561129257600080fd5b600080858511156114d757600080fd5b838611156114e457600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156115195780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561155b5761155b611521565b60405290565b600082601f83011261157257600080fd5b813567ffffffffffffffff8082111561158d5761158d611521565b604051601f8301601f19908116603f011681019082821181831017156115b5576115b5611521565b816040528381528660208588010111156115ce57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561160157600080fd5b611609611537565b6116128361137d565b815260208301356020820152604083013567ffffffffffffffff8082111561163957600080fd5b61164536838701611561565b6040840152606085013591508082111561165e57600080fd5b61166a36838701611561565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116ba57600080fd5b6116c636828801611561565b8385015250610140915081850135818111156116e157600080fd5b6116ed36828801611561565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156115195760149490940360031b84901b1690921692915050565b60208152600061135d60208301848661141b565b6060815261175e6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117866101c08501836111f7565b91506060870151605f19808685030160c08701526117a484836111f7565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261180087876111f7565b9650808c0151955050505080868503016101a0870152505061182282826111f7565b602085019690965250505060400152919050565b601f82111561187c57600081815260208120601f850160051c8101602086101561185d5750805b601f850160051c820191505b81811015610a5b57828155600101611869565b505050565b67ffffffffffffffff83111561189957611899611521565b6118ad836118a78354611122565b83611836565b6000601f8411600181146118e157600085156118c95750838201355b600019600387901b1c1916600186901b17835561193b565b600083815260209020601f19861690835b8281101561191257868501358255602094850194600190920191016118f2565b508682101561192f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf6113f2565b6001600160d01b031981358181169160068510156115195760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1c", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xd96fC2b4Bd575eFd14D41f9b3D15F134A051E4FE", + "initCode": "61016060405234801561001157600080fd5b50604051611b62380380611b6283398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119a16101c160003960008181610347015261050c01526000611085015260006110d4015260006110af01526000611008015260006110320152600061105c01526119a16000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161115c565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161115c565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c29291906111e7565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061123d565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061123d565b60405180910390f35b34801561028657600080fd5b5061029a610295366004611299565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce3660046112e5565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b604051610271929190611339565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c36600461138d565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611408565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611444565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611467565b9050600061047482610a97565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b6000610589610140860186611480565b610598916004916000916114c7565b6105a1916114f1565b905060006105ae866115ee565b90506000806105c06060890189611480565b6105cf916004916000916114c7565b6105d8916114f1565b90506001600160e01b03198416600003610670576105f5886115ee565b9250610605610140890189611480565b6106139160049082906114c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a057610693610140890189611480565b6106a2916024916010916114c7565b6106ab916116fd565b60601c915036600081816106cc856106c76101408f018f611480565b610b08565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611730565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611744565b915050610842868280602001905181019061083d9190611467565b610f12565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611122565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611122565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d4919083611881565b5060006109f686630c95955660e01b8686604051602401610417929190611730565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909590945092505050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610ad3575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b1d60586038898b6114c7565b610b2691611942565b905087605888610b368483611960565b92610b43939291906114c7565b909550935060008888610b57846058611960565b90610b63856078611960565b92610b70939291906114c7565b610b7991611942565b60001c90506000610c5a7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bb9939291906114c7565b610bc291611942565b60001c8d8d602490603892610bd9939291906114c7565b610be2916116fd565b60601c8b8b604051610bf59291906111e7565b604051908190038120610c3f95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fad565b90506000610cc9610c696103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c938a6078611960565b9089610ca08c6078611960565b610caa9190611960565b92610cb7939291906114c7565b60405160240161041793929190611444565b915050610d1981806020019051810190610ce39190611467565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d0a939291906114c7565b610d1391611942565b16610f12565b98508a8a84610d29876078611960565b610d339190611960565b610d3e9282906114c7565b9550955060405180608001604052808c8c600490600a92610d61939291906114c7565b610d6a91611973565b60d01c65ffffffffffff1681526020018c8c600a90601092610d8e939291906114c7565b610d9791611973565b60d01c65ffffffffffff1681526020018c8c602490603892610dbb939291906114c7565b610dc4916116fd565b60601c6001600160a01b031681526020018c8c601090602492610de9939291906114c7565b610df2916116fd565b60601c9052610dff6103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610eaa602460108c8e6114c7565b610eb3916116fd565b60013090810180546001600160a01b03191660609390931c92909217909155600301610ee0888a83611881565b50888b60588c610ef08883611960565b92610efd939291906114c7565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f35575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f5f578193505b8065ffffffffffff168365ffffffffffff161115610f7b578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fba610ffb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561105457507f000000000000000000000000000000000000000000000000000000000000000046145b1561107e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061113657607f821691505b60208210810361115657634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461117081611122565b8084870152604060018084166000811461119157600181146111ab576111d9565b60ff1985168984015283151560051b8901830195506111d9565b896000528660002060005b858110156111d15781548b82018601529083019088016111b6565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561121d57602081850181015186830182015201611201565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f860208301846111f7565b60008083601f84011261126257600080fd5b50813567ffffffffffffffff81111561127a57600080fd5b60208301915083602082850101111561129257600080fd5b9250929050565b6000806000604084860312156112ae57600080fd5b83359250602084013567ffffffffffffffff8111156112cc57600080fd5b6112d886828701611250565b9497909650939450505050565b6000806000606084860312156112fa57600080fd5b833567ffffffffffffffff81111561131157600080fd5b8401610160818703121561132457600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061135d908301846111f7565b949350505050565b6001600160a01b038116811461137a57600080fd5b50565b803561138881611365565b919050565b600080600080606085870312156113a357600080fd5b84356113ae81611365565b935060208501356113be81611365565b9250604085013567ffffffffffffffff8111156113da57600080fd5b6113e687828801611250565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf6113f2565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061145e60408301848661141b565b95945050505050565b60006020828403121561147957600080fd5b5051919050565b6000808335601e1984360301811261149757600080fd5b83018035915067ffffffffffffffff8211156114b257600080fd5b60200191503681900382131561129257600080fd5b600080858511156114d757600080fd5b838611156114e457600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156115195780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561155b5761155b611521565b60405290565b600082601f83011261157257600080fd5b813567ffffffffffffffff8082111561158d5761158d611521565b604051601f8301601f19908116603f011681019082821181831017156115b5576115b5611521565b816040528381528660208588010111156115ce57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561160157600080fd5b611609611537565b6116128361137d565b815260208301356020820152604083013567ffffffffffffffff8082111561163957600080fd5b61164536838701611561565b6040840152606085013591508082111561165e57600080fd5b61166a36838701611561565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116ba57600080fd5b6116c636828801611561565b8385015250610140915081850135818111156116e157600080fd5b6116ed36828801611561565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156115195760149490940360031b84901b1690921692915050565b60208152600061135d60208301848661141b565b6060815261175e6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117866101c08501836111f7565b91506060870151605f19808685030160c08701526117a484836111f7565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261180087876111f7565b9650808c0151955050505080868503016101a0870152505061182282826111f7565b602085019690965250505060400152919050565b601f82111561187c57600081815260208120601f850160051c8101602086101561185d5750805b601f850160051c820191505b81811015610a5b57828155600101611869565b505050565b67ffffffffffffffff83111561189957611899611521565b6118ad836118a78354611122565b83611836565b6000601f8411600181146118e157600085156118c95750838201355b600019600387901b1c1916600186901b17835561193b565b600083815260209020601f19861690835b8281101561191257868501358255602094850194600190920191016118f2565b508682101561192f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf6113f2565b6001600160d01b031981358181169160068510156115195760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xbd20Cab340Df38A63234e35026442F5D511dbf21", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x989c7bc39645391bf3fc10a9bb6f93687a7c47b0a06de4d55f01a778c193a271", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0xa66052E04AfF420521064dAEECC59eF4cf3A1ABD", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x1d", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x95ee09aab102984b74696649f552c0e67deb3c30110162941c5dc2c68205d26b", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x08E627ca6A0593C807091726a7fbB2887a1cB556", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4fbd6", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000008646ba75541866a33bfd6575c18915e498d0aaf5000000000000000000000000a66052e04aff420521064daeecc59ef4cf3a1abd0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1e", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xa1fb360440c7b5399f3afba03839a5165ad8308525d4f7d3fe756742c8f390f2", + "0x989c7bc39645391bf3fc10a9bb6f93687a7c47b0a06de4d55f01a778c193a271", + "0x95ee09aab102984b74696649f552c0e67deb3c30110162941c5dc2c68205d26b" + ], + "returns": {}, + "timestamp": 1685274646, + "chain": 80001, + "multi": false, + "commit": "d885223" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685274653.json b/broadcast/DeployKernel.s.sol/80001/run-1685274653.json new file mode 100644 index 00000000..33fda24b --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685274653.json @@ -0,0 +1,182 @@ +{ + "transactions": [ + { + "hash": "0xa1fb360440c7b5399f3afba03839a5165ad8308525d4f7d3fe756742c8f390f2", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0x8646Ba75541866a33bfd6575C18915E498d0aaF5", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x52b50b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614df5380380614df583398101604081905261002f916100f3565b8060405161003c906100d9565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100e6565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052600080546001600160a01b03191633179055610123565b611b6280610aef83390190565b6127a48061265183390190565b60006020828403121561010557600080fd5b81516001600160a01b038116811461011c57600080fd5b9392505050565b60805160a05160c05161097561017a600039600061010f01526000818160e8015281816101af015281816102e10152610355015260008181606c0152818161018d015281816102bf015261033301526109756000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063037637aa146100675780631bb12e69146100aa578063296601cd146100bd5780635ebaf1db146100d05780636c2f70fd146100e3578063b0d691fe1461010a575b600080fd5b61008e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61008e6100b836600461048f565b610131565b61008e6100cb36600461048f565b610261565b60005461008e906001600160a01b031681565b61008e7f000000000000000000000000000000000000000000000000000000000000000081565b61008e7f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161014b9493929190610526565b604051602081830303815290604052805190602001209050610255816040518060200161017790610482565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101e3949392919061057c565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b179052905161021c939291016105d7565b60408051601f198184030181529082905261023a9291602001610619565b60405160208183030381529060405280519060200120610444565b9150505b949350505050565b6000808585858560405160200161027b9493929190610526565b604051602081830303815290604052805190602001209050600061031582604051806020016102a990610482565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101e3949392919061057c565b90506001600160a01b0381163b156103305791506102599050565b817f0000000000000000000000000000000000000000000000000000000000000000887f00000000000000000000000000000000000000000000000000000000000000008989604051602401610389949392919061057c565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b179052516103bd90610482565b6103c89291906105d7565b8190604051809103906000f59050801580156103e8573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f743788888860405161043293929190610648565b60405180910390a35050949350505050565b6000610451838330610458565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061066d83390190565b600080600080606085870312156104a557600080fd5b84356001600160a01b03811681146104bc57600080fd5b9350602085013567ffffffffffffffff808211156104d957600080fd5b818701915087601f8301126104ed57600080fd5b8135818111156104fc57600080fd5b88602082850101111561050e57600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038581168252841660208201526060604082018190526000906105a99083018486610553565b9695505050505050565b60005b838110156105ce5781810151838201526020016105b6565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526106048160608501602087016105b3565b601f01601f1916919091016060019392505050565b6000835161062b8184602088016105b3565b83519083019061063f8183602088016105b3565b01949350505050565b60408152600061065c604083018587610553565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b62380380611b6283398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119a16101c160003960008181610347015261050c01526000611085015260006110d4015260006110af01526000611008015260006110320152600061105c01526119a16000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161115c565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161115c565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c29291906111e7565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061123d565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061123d565b60405180910390f35b34801561028657600080fd5b5061029a610295366004611299565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce3660046112e5565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b604051610271929190611339565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c36600461138d565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611408565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611444565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611467565b9050600061047482610a97565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b6000610589610140860186611480565b610598916004916000916114c7565b6105a1916114f1565b905060006105ae866115ee565b90506000806105c06060890189611480565b6105cf916004916000916114c7565b6105d8916114f1565b90506001600160e01b03198416600003610670576105f5886115ee565b9250610605610140890189611480565b6106139160049082906114c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a057610693610140890189611480565b6106a2916024916010916114c7565b6106ab916116fd565b60601c915036600081816106cc856106c76101408f018f611480565b610b08565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611730565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611744565b915050610842868280602001905181019061083d9190611467565b610f12565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611122565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611122565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d4919083611881565b5060006109f686630c95955660e01b8686604051602401610417929190611730565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909590945092505050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610ad3575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b1d60586038898b6114c7565b610b2691611942565b905087605888610b368483611960565b92610b43939291906114c7565b909550935060008888610b57846058611960565b90610b63856078611960565b92610b70939291906114c7565b610b7991611942565b60001c90506000610c5a7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bb9939291906114c7565b610bc291611942565b60001c8d8d602490603892610bd9939291906114c7565b610be2916116fd565b60601c8b8b604051610bf59291906111e7565b604051908190038120610c3f95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fad565b90506000610cc9610c696103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c938a6078611960565b9089610ca08c6078611960565b610caa9190611960565b92610cb7939291906114c7565b60405160240161041793929190611444565b915050610d1981806020019051810190610ce39190611467565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d0a939291906114c7565b610d1391611942565b16610f12565b98508a8a84610d29876078611960565b610d339190611960565b610d3e9282906114c7565b9550955060405180608001604052808c8c600490600a92610d61939291906114c7565b610d6a91611973565b60d01c65ffffffffffff1681526020018c8c600a90601092610d8e939291906114c7565b610d9791611973565b60d01c65ffffffffffff1681526020018c8c602490603892610dbb939291906114c7565b610dc4916116fd565b60601c6001600160a01b031681526020018c8c601090602492610de9939291906114c7565b610df2916116fd565b60601c9052610dff6103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610eaa602460108c8e6114c7565b610eb3916116fd565b60013090810180546001600160a01b03191660609390931c92909217909155600301610ee0888a83611881565b50888b60588c610ef08883611960565b92610efd939291906114c7565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f35575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f5f578193505b8065ffffffffffff168365ffffffffffff161115610f7b578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fba610ffb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561105457507f000000000000000000000000000000000000000000000000000000000000000046145b1561107e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061113657607f821691505b60208210810361115657634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461117081611122565b8084870152604060018084166000811461119157600181146111ab576111d9565b60ff1985168984015283151560051b8901830195506111d9565b896000528660002060005b858110156111d15781548b82018601529083019088016111b6565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561121d57602081850181015186830182015201611201565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f860208301846111f7565b60008083601f84011261126257600080fd5b50813567ffffffffffffffff81111561127a57600080fd5b60208301915083602082850101111561129257600080fd5b9250929050565b6000806000604084860312156112ae57600080fd5b83359250602084013567ffffffffffffffff8111156112cc57600080fd5b6112d886828701611250565b9497909650939450505050565b6000806000606084860312156112fa57600080fd5b833567ffffffffffffffff81111561131157600080fd5b8401610160818703121561132457600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061135d908301846111f7565b949350505050565b6001600160a01b038116811461137a57600080fd5b50565b803561138881611365565b919050565b600080600080606085870312156113a357600080fd5b84356113ae81611365565b935060208501356113be81611365565b9250604085013567ffffffffffffffff8111156113da57600080fd5b6113e687828801611250565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf6113f2565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061145e60408301848661141b565b95945050505050565b60006020828403121561147957600080fd5b5051919050565b6000808335601e1984360301811261149757600080fd5b83018035915067ffffffffffffffff8211156114b257600080fd5b60200191503681900382131561129257600080fd5b600080858511156114d757600080fd5b838611156114e457600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156115195780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561155b5761155b611521565b60405290565b600082601f83011261157257600080fd5b813567ffffffffffffffff8082111561158d5761158d611521565b604051601f8301601f19908116603f011681019082821181831017156115b5576115b5611521565b816040528381528660208588010111156115ce57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561160157600080fd5b611609611537565b6116128361137d565b815260208301356020820152604083013567ffffffffffffffff8082111561163957600080fd5b61164536838701611561565b6040840152606085013591508082111561165e57600080fd5b61166a36838701611561565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116ba57600080fd5b6116c636828801611561565b8385015250610140915081850135818111156116e157600080fd5b6116ed36828801611561565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156115195760149490940360031b84901b1690921692915050565b60208152600061135d60208301848661141b565b6060815261175e6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117866101c08501836111f7565b91506060870151605f19808685030160c08701526117a484836111f7565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261180087876111f7565b9650808c0151955050505080868503016101a0870152505061182282826111f7565b602085019690965250505060400152919050565b601f82111561187c57600081815260208120601f850160051c8101602086101561185d5750805b601f850160051c820191505b81811015610a5b57828155600101611869565b505050565b67ffffffffffffffff83111561189957611899611521565b6118ad836118a78354611122565b83611836565b6000601f8411600181146118e157600085156118c95750838201355b600019600387901b1c1916600186901b17835561193b565b600083815260209020601f19861690835b8281101561191257868501358255602094850194600190920191016118f2565b508682101561192f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf6113f2565b6001600160d01b031981358181169160068510156115195760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1c", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xd96fC2b4Bd575eFd14D41f9b3D15F134A051E4FE", + "initCode": "61016060405234801561001157600080fd5b50604051611b62380380611b6283398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119a16101c160003960008181610347015261050c01526000611085015260006110d4015260006110af01526000611008015260006110320152600061105c01526119a16000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161115c565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161115c565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c29291906111e7565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061123d565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061123d565b60405180910390f35b34801561028657600080fd5b5061029a610295366004611299565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce3660046112e5565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b604051610271929190611339565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c36600461138d565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611408565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611444565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611467565b9050600061047482610a97565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b6000610589610140860186611480565b610598916004916000916114c7565b6105a1916114f1565b905060006105ae866115ee565b90506000806105c06060890189611480565b6105cf916004916000916114c7565b6105d8916114f1565b90506001600160e01b03198416600003610670576105f5886115ee565b9250610605610140890189611480565b6106139160049082906114c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a057610693610140890189611480565b6106a2916024916010916114c7565b6106ab916116fd565b60601c915036600081816106cc856106c76101408f018f611480565b610b08565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611730565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611744565b915050610842868280602001905181019061083d9190611467565b610f12565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611122565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611122565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d4919083611881565b5060006109f686630c95955660e01b8686604051602401610417929190611730565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909590945092505050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610ad3575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b1d60586038898b6114c7565b610b2691611942565b905087605888610b368483611960565b92610b43939291906114c7565b909550935060008888610b57846058611960565b90610b63856078611960565b92610b70939291906114c7565b610b7991611942565b60001c90506000610c5a7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bb9939291906114c7565b610bc291611942565b60001c8d8d602490603892610bd9939291906114c7565b610be2916116fd565b60601c8b8b604051610bf59291906111e7565b604051908190038120610c3f95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fad565b90506000610cc9610c696103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c938a6078611960565b9089610ca08c6078611960565b610caa9190611960565b92610cb7939291906114c7565b60405160240161041793929190611444565b915050610d1981806020019051810190610ce39190611467565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d0a939291906114c7565b610d1391611942565b16610f12565b98508a8a84610d29876078611960565b610d339190611960565b610d3e9282906114c7565b9550955060405180608001604052808c8c600490600a92610d61939291906114c7565b610d6a91611973565b60d01c65ffffffffffff1681526020018c8c600a90601092610d8e939291906114c7565b610d9791611973565b60d01c65ffffffffffff1681526020018c8c602490603892610dbb939291906114c7565b610dc4916116fd565b60601c6001600160a01b031681526020018c8c601090602492610de9939291906114c7565b610df2916116fd565b60601c9052610dff6103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610eaa602460108c8e6114c7565b610eb3916116fd565b60013090810180546001600160a01b03191660609390931c92909217909155600301610ee0888a83611881565b50888b60588c610ef08883611960565b92610efd939291906114c7565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f35575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f5f578193505b8065ffffffffffff168365ffffffffffff161115610f7b578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fba610ffb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561105457507f000000000000000000000000000000000000000000000000000000000000000046145b1561107e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061113657607f821691505b60208210810361115657634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461117081611122565b8084870152604060018084166000811461119157600181146111ab576111d9565b60ff1985168984015283151560051b8901830195506111d9565b896000528660002060005b858110156111d15781548b82018601529083019088016111b6565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561121d57602081850181015186830182015201611201565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f860208301846111f7565b60008083601f84011261126257600080fd5b50813567ffffffffffffffff81111561127a57600080fd5b60208301915083602082850101111561129257600080fd5b9250929050565b6000806000604084860312156112ae57600080fd5b83359250602084013567ffffffffffffffff8111156112cc57600080fd5b6112d886828701611250565b9497909650939450505050565b6000806000606084860312156112fa57600080fd5b833567ffffffffffffffff81111561131157600080fd5b8401610160818703121561132457600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061135d908301846111f7565b949350505050565b6001600160a01b038116811461137a57600080fd5b50565b803561138881611365565b919050565b600080600080606085870312156113a357600080fd5b84356113ae81611365565b935060208501356113be81611365565b9250604085013567ffffffffffffffff8111156113da57600080fd5b6113e687828801611250565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf6113f2565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061145e60408301848661141b565b95945050505050565b60006020828403121561147957600080fd5b5051919050565b6000808335601e1984360301811261149757600080fd5b83018035915067ffffffffffffffff8211156114b257600080fd5b60200191503681900382131561129257600080fd5b600080858511156114d757600080fd5b838611156114e457600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156115195780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561155b5761155b611521565b60405290565b600082601f83011261157257600080fd5b813567ffffffffffffffff8082111561158d5761158d611521565b604051601f8301601f19908116603f011681019082821181831017156115b5576115b5611521565b816040528381528660208588010111156115ce57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561160157600080fd5b611609611537565b6116128361137d565b815260208301356020820152604083013567ffffffffffffffff8082111561163957600080fd5b61164536838701611561565b6040840152606085013591508082111561165e57600080fd5b61166a36838701611561565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116ba57600080fd5b6116c636828801611561565b8385015250610140915081850135818111156116e157600080fd5b6116ed36828801611561565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156115195760149490940360031b84901b1690921692915050565b60208152600061135d60208301848661141b565b6060815261175e6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117866101c08501836111f7565b91506060870151605f19808685030160c08701526117a484836111f7565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261180087876111f7565b9650808c0151955050505080868503016101a0870152505061182282826111f7565b602085019690965250505060400152919050565b601f82111561187c57600081815260208120601f850160051c8101602086101561185d5750805b601f850160051c820191505b81811015610a5b57828155600101611869565b505050565b67ffffffffffffffff83111561189957611899611521565b6118ad836118a78354611122565b83611836565b6000601f8411600181146118e157600085156118c95750838201355b600019600387901b1c1916600186901b17835561193b565b600083815260209020601f19861690835b8281101561191257868501358255602094850194600190920191016118f2565b508682101561192f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf6113f2565b6001600160d01b031981358181169160068510156115195760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xbd20Cab340Df38A63234e35026442F5D511dbf21", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x989c7bc39645391bf3fc10a9bb6f93687a7c47b0a06de4d55f01a778c193a271", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0xa66052E04AfF420521064dAEECC59eF4cf3A1ABD", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x9b72d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b506107e7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a366004610620565b61011a565b005b61009a61007f366004610662565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c536600461068b565b61019a565b6040519081526020016100ae565b6100ca6100e63660046106d7565b610220565b61006f6100f9366004610620565b505033600090815260208190526040902080546001600160a01b0319169055565b6000610129601482848661072b565b61013291610755565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b03161461020f576001610212565b60005b60ff169150505b9392505050565b60008080806102326020880188610662565b6001600160a01b03908116825260208201929092526040016000205416905061029d8461026361014088018861078a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061035f92505050565b6001600160a01b0316816001600160a01b0316036102bf576000915050610219565b6000610318856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061032e826102636101408a018a61078a565b9050806001600160a01b0316836001600160a01b0316146103555760019350505050610219565b5050509392505050565b600080600061036e8585610383565b9150915061037b816103c8565b509392505050565b60008082516041036103b95760208301516040840151606085015160001a6103ad8782858561051a565b945094505050506103c1565b506000905060025b9250929050565b60008160048111156103dc576103dc6107d1565b036103e45750565b60018160048111156103f8576103f86107d1565b0361044a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b600281600481111561045e5761045e6107d1565b036104ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610441565b60038160048111156104bf576104bf6107d1565b036105175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610441565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561055157506000905060036105d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156105a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166105ce576000600192509250506105d5565b9150600090505b94509492505050565b60008083601f8401126105f057600080fd5b50813567ffffffffffffffff81111561060857600080fd5b6020830191508360208285010111156103c157600080fd5b6000806020838503121561063357600080fd5b823567ffffffffffffffff81111561064a57600080fd5b610656858286016105de565b90969095509350505050565b60006020828403121561067457600080fd5b81356001600160a01b038116811461021957600080fd5b6000806000604084860312156106a057600080fd5b83359250602084013567ffffffffffffffff8111156106be57600080fd5b6106ca868287016105de565b9497909650939450505050565b6000806000606084860312156106ec57600080fd5b833567ffffffffffffffff81111561070357600080fd5b8401610160818703121561071657600080fd5b95602085013595506040909401359392505050565b6000808585111561073b57600080fd5b8386111561074857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107825780818660140360031b1b83161692505b505092915050565b6000808335601e198436030181126107a157600080fd5b83018035915067ffffffffffffffff8211156107bc57600080fd5b6020019150368190038213156103c157600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x1d", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x95ee09aab102984b74696649f552c0e67deb3c30110162941c5dc2c68205d26b", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x08E627ca6A0593C807091726a7fbB2887a1cB556", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4fbd6", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000008646ba75541866a33bfd6575c18915e498d0aaf5000000000000000000000000a66052e04aff420521064daeecc59ef4cf3a1abd0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1e", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa1fb360440c7b5399f3afba03839a5165ad8308525d4f7d3fe756742c8f390f2", + "transactionIndex": "0x3", + "blockHash": "0x745569a5f6025bb84a2b1504ee44d2688517cf177a0f3da054546b1d7fa58b25", + "blockNumber": "0x22790b2", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x40950d", + "gasUsed": "0x3f9ef5", + "contractAddress": "0x8646Ba75541866a33bfd6575C18915E498d0aaF5", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x000000000000000000000000000000000000000000000000001da0348fa4b4b00000000000000000000000000000000000000000000000000c26f186ca8aefcc000000000000000000000000000000000000000000001f8bbdae209115eaece50000000000000000000000000000000000000000000000000c0951523ae63b1c000000000000000000000000000000000000000000001f8bbdcbc0c5a58fa195", + "blockHash": "0x745569a5f6025bb84a2b1504ee44d2688517cf177a0f3da054546b1d7fa58b25", + "blockNumber": "0x22790b2", + "transactionHash": "0xa1fb360440c7b5399f3afba03839a5165ad8308525d4f7d3fe756742c8f390f2", + "transactionIndex": "0x3", + "logIndex": "0x6", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x989c7bc39645391bf3fc10a9bb6f93687a7c47b0a06de4d55f01a778c193a271", + "transactionIndex": "0x4", + "blockHash": "0x745569a5f6025bb84a2b1504ee44d2688517cf177a0f3da054546b1d7fa58b25", + "blockNumber": "0x22790b2", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x480e44", + "gasUsed": "0x77937", + "contractAddress": "0xa66052E04AfF420521064dAEECC59eF4cf3A1ABD", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x00000000000000000000000000000000000000000000000000037ae8faff38900000000000000000000000000000000000000000000000000c09515236ec4bcc000000000000000000000000000000000000000000001f8bbdcbc0c5a58fa1950000000000000000000000000000000000000000000000000c05d6693bed133c000000000000000000000000000000000000000000001f8bbdcf3baea08eda25", + "blockHash": "0x745569a5f6025bb84a2b1504ee44d2688517cf177a0f3da054546b1d7fa58b25", + "blockNumber": "0x22790b2", + "transactionHash": "0x989c7bc39645391bf3fc10a9bb6f93687a7c47b0a06de4d55f01a778c193a271", + "transactionIndex": "0x4", + "logIndex": "0x7", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x95ee09aab102984b74696649f552c0e67deb3c30110162941c5dc2c68205d26b", + "transactionIndex": "0x5", + "blockHash": "0x745569a5f6025bb84a2b1504ee44d2688517cf177a0f3da054546b1d7fa58b25", + "blockNumber": "0x22790b2", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x4be3ae", + "gasUsed": "0x3d56a", + "contractAddress": "0x08E627ca6A0593C807091726a7fbB2887a1cB556", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000001c901ac15f1600000000000000000000000000000000000000000000000000c05d6693b757fcc000000000000000000000000000000000000000000001f8bbdcf3baea08eda250000000000000000000000000000000000000000000000000c040d678f5f8e6c000000000000000000000000000000000000000000001f8bbdd104b04ca4cb85", + "blockHash": "0x745569a5f6025bb84a2b1504ee44d2688517cf177a0f3da054546b1d7fa58b25", + "blockNumber": "0x22790b2", + "transactionHash": "0x95ee09aab102984b74696649f552c0e67deb3c30110162941c5dc2c68205d26b", + "transactionIndex": "0x5", + "logIndex": "0x8", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1685274653, + "chain": 80001, + "multi": false, + "commit": "d885223" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685552729.json b/broadcast/DeployKernel.s.sol/80001/run-1685552729.json new file mode 100644 index 00000000..d33f1f24 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685552729.json @@ -0,0 +1,86 @@ +{ + "transactions": [ + { + "hash": "0xe9b58b16cf2f004daf6a7c01713c0e6bca8376da9ab948074359d1696827a541", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0xCB7a5c2789A9eeb544568C885a1c562b67Ffc77D", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x52469a", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x25", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xf14a4b1213c71bFBeDb854f39476794Ae65096C7", + "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x3f5d076AD2a7Aa4191F64517FE93740c26Aea03C", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x8e488eca154c1f3b1f30b3036a0d6551e7688eb67157e65c51af6465f62b360d", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0x9B43aB0534e33b458123b17BFb1Ad6a192Cd9E58", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0xa3f13", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x26", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x64c333d9abc1f9597b82743944b96a560f8830c0659733da5b872983e8e81591", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x983517ec33ADcc44ba10F2929fb1d2395bb3880C", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4fbd6", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b939250505056000000000000000000000000cb7a5c2789a9eeb544568c885a1c562b67ffc77d0000000000000000000000009b43ab0534e33b458123b17bfb1ad6a192cd9e580000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x27", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xe9b58b16cf2f004daf6a7c01713c0e6bca8376da9ab948074359d1696827a541", + "0x8e488eca154c1f3b1f30b3036a0d6551e7688eb67157e65c51af6465f62b360d", + "0x64c333d9abc1f9597b82743944b96a560f8830c0659733da5b872983e8e81591" + ], + "returns": {}, + "timestamp": 1685552729, + "chain": 80001, + "multi": false, + "commit": "d3898a0" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685552736.json b/broadcast/DeployKernel.s.sol/80001/run-1685552736.json new file mode 100644 index 00000000..f18ea9c8 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685552736.json @@ -0,0 +1,182 @@ +{ + "transactions": [ + { + "hash": "0xe9b58b16cf2f004daf6a7c01713c0e6bca8376da9ab948074359d1696827a541", + "transactionType": "CREATE", + "contractName": "KernelFactory", + "contractAddress": "0xCB7a5c2789A9eeb544568C885a1c562b67Ffc77D", + "function": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x52469a", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x25", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xf14a4b1213c71bFBeDb854f39476794Ae65096C7", + "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x3f5d076AD2a7Aa4191F64517FE93740c26Aea03C", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x8e488eca154c1f3b1f30b3036a0d6551e7688eb67157e65c51af6465f62b360d", + "transactionType": "CREATE", + "contractName": "ECDSAValidator", + "contractAddress": "0x9B43aB0534e33b458123b17BFb1Ad6a192Cd9E58", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0xa3f13", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x26", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x64c333d9abc1f9597b82743944b96a560f8830c0659733da5b872983e8e81591", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x983517ec33ADcc44ba10F2929fb1d2395bb3880C", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x4fbd6", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b939250505056000000000000000000000000cb7a5c2789a9eeb544568c885a1c562b67ffc77d0000000000000000000000009b43ab0534e33b458123b17bfb1ad6a192cd9e580000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x27", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe9b58b16cf2f004daf6a7c01713c0e6bca8376da9ab948074359d1696827a541", + "transactionIndex": "0x13", + "blockHash": "0xdb33fcf52fecf2374a77b35c90496c91aae830e815a7327128bdc4cacc715864", + "blockNumber": "0x2298fe1", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x9a7107", + "gasUsed": "0x3f4a01", + "contractAddress": "0xCB7a5c2789A9eeb544568C885a1c562b67Ffc77D", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x000000000000000000000000000000000000000000000000001d78a55c08f3f000000000000000000000000000000000000000000000000003abe1ff08d84f6c0000000000000000000000000000000000000000000031dba960182241a96912000000000000000000000000000000000000000000000000038e6959accf5b7c0000000000000000000000000000000000000000000031dba97d90c79db25d02", + "blockHash": "0xdb33fcf52fecf2374a77b35c90496c91aae830e815a7327128bdc4cacc715864", + "blockNumber": "0x2298fe1", + "transactionHash": "0xe9b58b16cf2f004daf6a7c01713c0e6bca8376da9ab948074359d1696827a541", + "transactionIndex": "0x13", + "logIndex": "0x9f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x8e488eca154c1f3b1f30b3036a0d6551e7688eb67157e65c51af6465f62b360d", + "transactionIndex": "0x14", + "blockHash": "0xdb33fcf52fecf2374a77b35c90496c91aae830e815a7327128bdc4cacc715864", + "blockNumber": "0x2298fe1", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0xa252c7", + "gasUsed": "0x7e1c0", + "contractAddress": "0x9B43aB0534e33b458123b17BFb1Ad6a192Cd9E58", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x0000000000000000000000000000000000000000000000000003ab968ac4e400000000000000000000000000000000000000000000000000038e6959a8dabb6c0000000000000000000000000000000000000000000031dba97d90c79db25d02000000000000000000000000000000000000000000000000038abdc31e15d76c0000000000000000000000000000000000000000000031dba9813c5e28774102", + "blockHash": "0xdb33fcf52fecf2374a77b35c90496c91aae830e815a7327128bdc4cacc715864", + "blockNumber": "0x2298fe1", + "transactionHash": "0x8e488eca154c1f3b1f30b3036a0d6551e7688eb67157e65c51af6465f62b360d", + "transactionIndex": "0x14", + "logIndex": "0xa0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x64c333d9abc1f9597b82743944b96a560f8830c0659733da5b872983e8e81591", + "transactionIndex": "0x15", + "blockHash": "0xdb33fcf52fecf2374a77b35c90496c91aae830e815a7327128bdc4cacc715864", + "blockNumber": "0x2298fe1", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0xa62831", + "gasUsed": "0x3d56a", + "contractAddress": "0x983517ec33ADcc44ba10F2929fb1d2395bb3880C", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x0000000000000000000000000000000000000000000000000001c901ac15f160000000000000000000000000000000000000000000000000038abdc31d97bb6c0000000000000000000000000000000000000000000031dba9813c5e287741020000000000000000000000000000000000000000000000000388f4c17181ca0c0000000000000000000000000000000000000000000031dba983055fd48d3262", + "blockHash": "0xdb33fcf52fecf2374a77b35c90496c91aae830e815a7327128bdc4cacc715864", + "blockNumber": "0x2298fe1", + "transactionHash": "0x64c333d9abc1f9597b82743944b96a560f8830c0659733da5b872983e8e81591", + "transactionIndex": "0x15", + "logIndex": "0xa1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1685552736, + "chain": 80001, + "multi": false, + "commit": "d3898a0" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685554144.json b/broadcast/DeployKernel.s.sol/80001/run-1685554144.json new file mode 100644 index 00000000..21585575 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685554144.json @@ -0,0 +1,104 @@ +{ + "transactions": [ + { + "hash": "0xd18af86f935b3c63d7cde4a1bcec8e4f5864409b4524b13dd6e243bac1630fca", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x5cbf01", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x28", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39", + "initCode": "60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xcc9B83cc9aF4a79663EC9E326c67B0Fd27Afd7f7", + "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xC69eb9FFCDD53cF035a6e3bd5b73C22a43A5dF7A", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x93b7b8afd9f03db8a328aea78170f45423f2cdacc2b2e3e5bd0d69493f99c7a2", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x29", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xea6b432028289a0ca687b14b375873f38710dc31ea343a2c4ee6d83e71c2e5fd", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x59e62", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2a", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xD49a72cb78C44c6bfbf0d471581B7635cF62E81e", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xd18af86f935b3c63d7cde4a1bcec8e4f5864409b4524b13dd6e243bac1630fca", + "0x93b7b8afd9f03db8a328aea78170f45423f2cdacc2b2e3e5bd0d69493f99c7a2", + "0xea6b432028289a0ca687b14b375873f38710dc31ea343a2c4ee6d83e71c2e5fd" + ], + "returns": {}, + "timestamp": 1685554144, + "chain": 80001, + "multi": false, + "commit": "d3898a0" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685554151.json b/broadcast/DeployKernel.s.sol/80001/run-1685554151.json new file mode 100644 index 00000000..c1f9569e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685554151.json @@ -0,0 +1,200 @@ +{ + "transactions": [ + { + "hash": "0xd18af86f935b3c63d7cde4a1bcec8e4f5864409b4524b13dd6e243bac1630fca", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x5cbf01", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x28", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39", + "initCode": "60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xcc9B83cc9aF4a79663EC9E326c67B0Fd27Afd7f7", + "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xC69eb9FFCDD53cF035a6e3bd5b73C22a43A5dF7A", + "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x93b7b8afd9f03db8a328aea78170f45423f2cdacc2b2e3e5bd0d69493f99c7a2", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x29", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xea6b432028289a0ca687b14b375873f38710dc31ea343a2c4ee6d83e71c2e5fd", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x59e62", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2a", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xD49a72cb78C44c6bfbf0d471581B7635cF62E81e", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xd18af86f935b3c63d7cde4a1bcec8e4f5864409b4524b13dd6e243bac1630fca", + "transactionIndex": "0x9", + "blockHash": "0xda4dcedeaefc3b7ddb67e68e7a3f025c4ae5b6f673a9cea0851e32b7e4d553f1", + "blockNumber": "0x229927a", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x65ec2b", + "gasUsed": "0x3f6a89", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x000000000000000000000000000000000000000000000000001d87cb62be20e70000000000000000000000000000000000000000000000000388f4c17144736c00000000000000000000000000000000000000000000112865af64dd70a568cd000000000000000000000000000000000000000000000000036b6cf60e86528500000000000000000000000000000000000000000000112865cceca8d36389b4", + "blockHash": "0xda4dcedeaefc3b7ddb67e68e7a3f025c4ae5b6f673a9cea0851e32b7e4d553f1", + "blockNumber": "0x229927a", + "transactionHash": "0xd18af86f935b3c63d7cde4a1bcec8e4f5864409b4524b13dd6e243bac1630fca", + "transactionIndex": "0x9", + "logIndex": "0x29", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x93b7b8afd9f03db8a328aea78170f45423f2cdacc2b2e3e5bd0d69493f99c7a2", + "transactionIndex": "0xa", + "blockHash": "0xda4dcedeaefc3b7ddb67e68e7a3f025c4ae5b6f673a9cea0851e32b7e4d553f1", + "blockNumber": "0x229927a", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x6dd172", + "gasUsed": "0x7e547", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x0000000000000000000000000000000000000000000000000003ad3b08b9d249000000000000000000000000000000000000000000000000036b6cf60a503f6c00000000000000000000000000000000000000000000112865cceca8d36389b40000000000000000000000000000000000000000000000000367bfbb01966d2300000000000000000000000000000000000000000000112865d099e3dc1d5bfd", + "blockHash": "0xda4dcedeaefc3b7ddb67e68e7a3f025c4ae5b6f673a9cea0851e32b7e4d553f1", + "blockNumber": "0x229927a", + "transactionHash": "0x93b7b8afd9f03db8a328aea78170f45423f2cdacc2b2e3e5bd0d69493f99c7a2", + "transactionIndex": "0xa", + "logIndex": "0x2a", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xea6b432028289a0ca687b14b375873f38710dc31ea343a2c4ee6d83e71c2e5fd", + "transactionIndex": "0xb", + "blockHash": "0xda4dcedeaefc3b7ddb67e68e7a3f025c4ae5b6f673a9cea0851e32b7e4d553f1", + "blockNumber": "0x229927a", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x71a8f5", + "gasUsed": "0x3d783", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x0000000000000000000000000000000000000000000000000001c9fbbb756c4d0000000000000000000000000000000000000000000000000367bfbb0110336c00000000000000000000000000000000000000000000112865d099e3dc1d5bfd0000000000000000000000000000000000000000000000000365f5bf459ac71f00000000000000000000000000000000000000000000112865d263df9792c84a", + "blockHash": "0xda4dcedeaefc3b7ddb67e68e7a3f025c4ae5b6f673a9cea0851e32b7e4d553f1", + "blockNumber": "0x229927a", + "transactionHash": "0xea6b432028289a0ca687b14b375873f38710dc31ea343a2c4ee6d83e71c2e5fd", + "transactionIndex": "0xb", + "logIndex": "0x2b", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1685554151, + "chain": 80001, + "multi": false, + "commit": "d3898a0" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685562259.json b/broadcast/DeployKernel.s.sol/80001/run-1685562259.json new file mode 100644 index 00000000..26215f3b --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685562259.json @@ -0,0 +1,60 @@ +{ + "transactions": [ + { + "hash": "0xdd0f850851e4ec5503895964e7f9b1e65383fdbfd4922f3229abb15318086f80", + "transactionType": "CREATE", + "contractName": "ERC721Actions", + "contractAddress": "0x64A5061A9a478028873e86eE551EFf6c040054E2", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x2d", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x780326589b0ee3de442293de5886598bc4507980ddcdba3a82e965ec779553f8", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xf4046", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610c1c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610964565b610179565b005b61008461007f3660046109a6565b61034e565b6040519081526020015b60405180910390f35b6100846100a53660046109f2565b610390565b61006f6100b8366004610964565b610661565b61012c6100cb366004610a62565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a95565b61019191610abf565b60601c905060006101a6601860148587610a95565b6101af91610af4565b905060006101c1601c60188688610a95565b6101ca91610af4565b905060006101dc6022601c8789610a95565b6101e591610b22565b60d01c905060006101fa60286022888a610a95565b61020391610b22565b60d01c90506000610218602c6028898b610a95565b61022191610af4565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a08401908152336000908152808c528581206001600160a01b039d909d1681529b909a5292909920905181549751995195519251985164ffffffffff1990981690151564ffffffff0019161761010099841c99909902989098176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b949092169390930263ffffffff60a81b191617600160a81b63ffffffff9092169190910217909155505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103ea846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061043a82610400610140890189610b50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106a892505050565b90506000808061044d60208a018a610b97565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805490915060ff1661048e576001935050505061065a565b8054610100900460e01b6001600160e01b0319166104af6060890189610b50565b6104be91600491600091610a95565b6104c791610af4565b6001600160e01b031916146105175760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610387565b60006105266060890189610b50565b8354600160a81b900463ffffffff1690610541826014610bb2565b63ffffffff169261055493929190610a95565b61055d91610abf565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105dc9190610be4565b6106285760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610387565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106706014828486610a95565b61067991610abf565b3360009081526020818152604080832060609490941c83529290522080546001600160c81b0319169055505050565b60008060006106b785856106cc565b915091506106c481610711565b509392505050565b60008082516041036107025760208301516040840151606085015160001a6106f68782858561085e565b9450945050505061070a565b506000905060025b9250929050565b600081600481111561072557610725610c06565b0361072d5750565b600181600481111561074157610741610c06565b0361078e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610387565b60028160048111156107a2576107a2610c06565b036107ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610387565b600381600481111561080357610803610c06565b0361085b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610387565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156108955750600090506003610919565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108e9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661091257600060019250925050610919565b9150600090505b94509492505050565b60008083601f84011261093457600080fd5b50813567ffffffffffffffff81111561094c57600080fd5b60208301915083602082850101111561070a57600080fd5b6000806020838503121561097757600080fd5b823567ffffffffffffffff81111561098e57600080fd5b61099a85828601610922565b90969095509350505050565b6000806000604084860312156109bb57600080fd5b83359250602084013567ffffffffffffffff8111156109d957600080fd5b6109e586828701610922565b9497909650939450505050565b600080600060608486031215610a0757600080fd5b833567ffffffffffffffff811115610a1e57600080fd5b84016101608187031215610a3157600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a5d57600080fd5b919050565b60008060408385031215610a7557600080fd5b610a7e83610a46565b9150610a8c60208401610a46565b90509250929050565b60008085851115610aa557600080fd5b83861115610ab257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610aec5780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610aec5760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610aec5760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6757600080fd5b83018035915067ffffffffffffffff821115610b8257600080fd5b60200191503681900382131561070a57600080fd5b600060208284031215610ba957600080fd5b61065a82610a46565b63ffffffff818116838216019080821115610bdd57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bf657600080fd5b8151801515811461065a57600080fd5b634e487b7160e01b600052602160045260246000fd00000000000000000000000064a5061a9a478028873e86ee551eff6c040054e2", + "nonce": "0x2e", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x10997c91a2D823C6fDD468540F1Ca7665f717c89", + "initCode": "608060405234801561001057600080fd5b50610c1c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610964565b610179565b005b61008461007f3660046109a6565b61034e565b6040519081526020015b60405180910390f35b6100846100a53660046109f2565b610390565b61006f6100b8366004610964565b610661565b61012c6100cb366004610a62565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a95565b61019191610abf565b60601c905060006101a6601860148587610a95565b6101af91610af4565b905060006101c1601c60188688610a95565b6101ca91610af4565b905060006101dc6022601c8789610a95565b6101e591610b22565b60d01c905060006101fa60286022888a610a95565b61020391610b22565b60d01c90506000610218602c6028898b610a95565b61022191610af4565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a08401908152336000908152808c528581206001600160a01b039d909d1681529b909a5292909920905181549751995195519251985164ffffffffff1990981690151564ffffffff0019161761010099841c99909902989098176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b949092169390930263ffffffff60a81b191617600160a81b63ffffffff9092169190910217909155505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103ea846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061043a82610400610140890189610b50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106a892505050565b90506000808061044d60208a018a610b97565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805490915060ff1661048e576001935050505061065a565b8054610100900460e01b6001600160e01b0319166104af6060890189610b50565b6104be91600491600091610a95565b6104c791610af4565b6001600160e01b031916146105175760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610387565b60006105266060890189610b50565b8354600160a81b900463ffffffff1690610541826014610bb2565b63ffffffff169261055493929190610a95565b61055d91610abf565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105dc9190610be4565b6106285760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610387565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106706014828486610a95565b61067991610abf565b3360009081526020818152604080832060609490941c83529290522080546001600160c81b0319169055505050565b60008060006106b785856106cc565b915091506106c481610711565b509392505050565b60008082516041036107025760208301516040840151606085015160001a6106f68782858561085e565b9450945050505061070a565b506000905060025b9250929050565b600081600481111561072557610725610c06565b0361072d5750565b600181600481111561074157610741610c06565b0361078e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610387565b60028160048111156107a2576107a2610c06565b036107ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610387565b600381600481111561080357610803610c06565b0361085b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610387565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156108955750600090506003610919565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108e9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661091257600060019250925050610919565b9150600090505b94509492505050565b60008083601f84011261093457600080fd5b50813567ffffffffffffffff81111561094c57600080fd5b60208301915083602082850101111561070a57600080fd5b6000806020838503121561097757600080fd5b823567ffffffffffffffff81111561098e57600080fd5b61099a85828601610922565b90969095509350505050565b6000806000604084860312156109bb57600080fd5b83359250602084013567ffffffffffffffff8111156109d957600080fd5b6109e586828701610922565b9497909650939450505050565b600080600060608486031215610a0757600080fd5b833567ffffffffffffffff811115610a1e57600080fd5b84016101608187031215610a3157600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a5d57600080fd5b919050565b60008060408385031215610a7557600080fd5b610a7e83610a46565b9150610a8c60208401610a46565b90509250929050565b60008085851115610aa557600080fd5b83861115610ab257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610aec5780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610aec5760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610aec5760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6757600080fd5b83018035915067ffffffffffffffff821115610b8257600080fd5b60200191503681900382131561070a57600080fd5b600060208284031215610ba957600080fd5b61065a82610a46565b63ffffffff818116838216019080821115610bdd57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bf657600080fd5b8151801515811461065a57600080fd5b634e487b7160e01b600052602160045260246000fd00000000000000000000000064a5061a9a478028873e86ee551eff6c040054e2" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xdd0f850851e4ec5503895964e7f9b1e65383fdbfd4922f3229abb15318086f80", + "0x780326589b0ee3de442293de5886598bc4507980ddcdba3a82e965ec779553f8" + ], + "returns": {}, + "timestamp": 1685562259, + "chain": 80001, + "multi": false, + "commit": "55649c1" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685562265.json b/broadcast/DeployKernel.s.sol/80001/run-1685562265.json new file mode 100644 index 00000000..db01920a --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685562265.json @@ -0,0 +1,124 @@ +{ + "transactions": [ + { + "hash": "0xdd0f850851e4ec5503895964e7f9b1e65383fdbfd4922f3229abb15318086f80", + "transactionType": "CREATE", + "contractName": "ERC721Actions", + "contractAddress": "0x64A5061A9a478028873e86eE551EFf6c040054E2", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x2d", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x780326589b0ee3de442293de5886598bc4507980ddcdba3a82e965ec779553f8", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xf4046", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610c1c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610964565b610179565b005b61008461007f3660046109a6565b61034e565b6040519081526020015b60405180910390f35b6100846100a53660046109f2565b610390565b61006f6100b8366004610964565b610661565b61012c6100cb366004610a62565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a95565b61019191610abf565b60601c905060006101a6601860148587610a95565b6101af91610af4565b905060006101c1601c60188688610a95565b6101ca91610af4565b905060006101dc6022601c8789610a95565b6101e591610b22565b60d01c905060006101fa60286022888a610a95565b61020391610b22565b60d01c90506000610218602c6028898b610a95565b61022191610af4565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a08401908152336000908152808c528581206001600160a01b039d909d1681529b909a5292909920905181549751995195519251985164ffffffffff1990981690151564ffffffff0019161761010099841c99909902989098176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b949092169390930263ffffffff60a81b191617600160a81b63ffffffff9092169190910217909155505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103ea846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061043a82610400610140890189610b50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106a892505050565b90506000808061044d60208a018a610b97565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805490915060ff1661048e576001935050505061065a565b8054610100900460e01b6001600160e01b0319166104af6060890189610b50565b6104be91600491600091610a95565b6104c791610af4565b6001600160e01b031916146105175760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610387565b60006105266060890189610b50565b8354600160a81b900463ffffffff1690610541826014610bb2565b63ffffffff169261055493929190610a95565b61055d91610abf565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105dc9190610be4565b6106285760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610387565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106706014828486610a95565b61067991610abf565b3360009081526020818152604080832060609490941c83529290522080546001600160c81b0319169055505050565b60008060006106b785856106cc565b915091506106c481610711565b509392505050565b60008082516041036107025760208301516040840151606085015160001a6106f68782858561085e565b9450945050505061070a565b506000905060025b9250929050565b600081600481111561072557610725610c06565b0361072d5750565b600181600481111561074157610741610c06565b0361078e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610387565b60028160048111156107a2576107a2610c06565b036107ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610387565b600381600481111561080357610803610c06565b0361085b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610387565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156108955750600090506003610919565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108e9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661091257600060019250925050610919565b9150600090505b94509492505050565b60008083601f84011261093457600080fd5b50813567ffffffffffffffff81111561094c57600080fd5b60208301915083602082850101111561070a57600080fd5b6000806020838503121561097757600080fd5b823567ffffffffffffffff81111561098e57600080fd5b61099a85828601610922565b90969095509350505050565b6000806000604084860312156109bb57600080fd5b83359250602084013567ffffffffffffffff8111156109d957600080fd5b6109e586828701610922565b9497909650939450505050565b600080600060608486031215610a0757600080fd5b833567ffffffffffffffff811115610a1e57600080fd5b84016101608187031215610a3157600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a5d57600080fd5b919050565b60008060408385031215610a7557600080fd5b610a7e83610a46565b9150610a8c60208401610a46565b90509250929050565b60008085851115610aa557600080fd5b83861115610ab257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610aec5780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610aec5760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610aec5760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6757600080fd5b83018035915067ffffffffffffffff821115610b8257600080fd5b60200191503681900382131561070a57600080fd5b600060208284031215610ba957600080fd5b61065a82610a46565b63ffffffff818116838216019080821115610bdd57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bf657600080fd5b8151801515811461065a57600080fd5b634e487b7160e01b600052602160045260246000fd00000000000000000000000064a5061a9a478028873e86ee551eff6c040054e2", + "nonce": "0x2e", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x10997c91a2D823C6fDD468540F1Ca7665f717c89", + "initCode": "608060405234801561001057600080fd5b50610c1c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610964565b610179565b005b61008461007f3660046109a6565b61034e565b6040519081526020015b60405180910390f35b6100846100a53660046109f2565b610390565b61006f6100b8366004610964565b610661565b61012c6100cb366004610a62565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a95565b61019191610abf565b60601c905060006101a6601860148587610a95565b6101af91610af4565b905060006101c1601c60188688610a95565b6101ca91610af4565b905060006101dc6022601c8789610a95565b6101e591610b22565b60d01c905060006101fa60286022888a610a95565b61020391610b22565b60d01c90506000610218602c6028898b610a95565b61022191610af4565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a08401908152336000908152808c528581206001600160a01b039d909d1681529b909a5292909920905181549751995195519251985164ffffffffff1990981690151564ffffffff0019161761010099841c99909902989098176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b949092169390930263ffffffff60a81b191617600160a81b63ffffffff9092169190910217909155505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103ea846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061043a82610400610140890189610b50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106a892505050565b90506000808061044d60208a018a610b97565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805490915060ff1661048e576001935050505061065a565b8054610100900460e01b6001600160e01b0319166104af6060890189610b50565b6104be91600491600091610a95565b6104c791610af4565b6001600160e01b031916146105175760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610387565b60006105266060890189610b50565b8354600160a81b900463ffffffff1690610541826014610bb2565b63ffffffff169261055493929190610a95565b61055d91610abf565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105dc9190610be4565b6106285760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610387565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106706014828486610a95565b61067991610abf565b3360009081526020818152604080832060609490941c83529290522080546001600160c81b0319169055505050565b60008060006106b785856106cc565b915091506106c481610711565b509392505050565b60008082516041036107025760208301516040840151606085015160001a6106f68782858561085e565b9450945050505061070a565b506000905060025b9250929050565b600081600481111561072557610725610c06565b0361072d5750565b600181600481111561074157610741610c06565b0361078e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610387565b60028160048111156107a2576107a2610c06565b036107ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610387565b600381600481111561080357610803610c06565b0361085b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610387565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156108955750600090506003610919565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108e9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661091257600060019250925050610919565b9150600090505b94509492505050565b60008083601f84011261093457600080fd5b50813567ffffffffffffffff81111561094c57600080fd5b60208301915083602082850101111561070a57600080fd5b6000806020838503121561097757600080fd5b823567ffffffffffffffff81111561098e57600080fd5b61099a85828601610922565b90969095509350505050565b6000806000604084860312156109bb57600080fd5b83359250602084013567ffffffffffffffff8111156109d957600080fd5b6109e586828701610922565b9497909650939450505050565b600080600060608486031215610a0757600080fd5b833567ffffffffffffffff811115610a1e57600080fd5b84016101608187031215610a3157600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a5d57600080fd5b919050565b60008060408385031215610a7557600080fd5b610a7e83610a46565b9150610a8c60208401610a46565b90509250929050565b60008085851115610aa557600080fd5b83861115610ab257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610aec5780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610aec5760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610aec5760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6757600080fd5b83018035915067ffffffffffffffff821115610b8257600080fd5b60200191503681900382131561070a57600080fd5b600060208284031215610ba957600080fd5b61065a82610a46565b63ffffffff818116838216019080821115610bdd57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bf657600080fd5b8151801515811461065a57600080fd5b634e487b7160e01b600052602160045260246000fd00000000000000000000000064a5061a9a478028873e86ee551eff6c040054e2" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xdd0f850851e4ec5503895964e7f9b1e65383fdbfd4922f3229abb15318086f80", + "transactionIndex": "0x6", + "blockHash": "0xa1ebc1bd2ba72a6e8e5e675dbf6a3818135b90db2bf2c7248f3a75affa12f9d9", + "blockNumber": "0x229a165", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x154871", + "gasUsed": "0x1a44b", + "contractAddress": "0x64A5061A9a478028873e86eE551EFf6c040054E2", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000000c3b6d36673050000000000000000000000000000000000000000000000000e7fe835dd00466c000000000000000000000000000000000000000000000a081c14cb0c7338015e0000000000000000000000000000000000000000000000000e7f247f0999d367000000000000000000000000000000000000000000000a081c158ec3469e7463", + "blockHash": "0xa1ebc1bd2ba72a6e8e5e675dbf6a3818135b90db2bf2c7248f3a75affa12f9d9", + "blockNumber": "0x229a165", + "transactionHash": "0xdd0f850851e4ec5503895964e7f9b1e65383fdbfd4922f3229abb15318086f80", + "transactionIndex": "0x6", + "logIndex": "0x1e", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0x780326589b0ee3de442293de5886598bc4507980ddcdba3a82e965ec779553f8", + "transactionIndex": "0x7", + "blockHash": "0xa1ebc1bd2ba72a6e8e5e675dbf6a3818135b90db2bf2c7248f3a75affa12f9d9", + "blockNumber": "0x229a165", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x205311", + "gasUsed": "0xb0aa0", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000005243ff488cb600000000000000000000000000000000000000000000000000e7f247f097dea6c000000000000000000000000000000000000000000000a081c158ec3469e74630000000000000000000000000000000000000000000000000e7a003f14f51f0c000000000000000000000000000000000000000000000a081c1ab3033b273fc3", + "blockHash": "0xa1ebc1bd2ba72a6e8e5e675dbf6a3818135b90db2bf2c7248f3a75affa12f9d9", + "blockNumber": "0x229a165", + "transactionHash": "0x780326589b0ee3de442293de5886598bc4507980ddcdba3a82e965ec779553f8", + "transactionIndex": "0x7", + "logIndex": "0x1f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1685562265, + "chain": 80001, + "multi": false, + "commit": "55649c1" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685566222.json b/broadcast/DeployKernel.s.sol/80001/run-1685566222.json new file mode 100644 index 00000000..591d77cb --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685566222.json @@ -0,0 +1,60 @@ +{ + "transactions": [ + { + "hash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", + "transactionType": "CREATE", + "contractName": "ERC721Actions", + "contractAddress": "0xFC3a1F6577A8bCf6ef23AA1024E07c3504824dd3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x2f", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xea763", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3", + "nonce": "0x30", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x842Ea41c15B32a8bcbDb17B5232b220e3B87082B", + "initCode": "608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", + "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5" + ], + "returns": {}, + "timestamp": 1685566222, + "chain": 80001, + "multi": false, + "commit": "55649c1" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1685566229.json b/broadcast/DeployKernel.s.sol/80001/run-1685566229.json new file mode 100644 index 00000000..f2eb4914 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1685566229.json @@ -0,0 +1,124 @@ +{ + "transactions": [ + { + "hash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", + "transactionType": "CREATE", + "contractName": "ERC721Actions", + "contractAddress": "0xFC3a1F6577A8bCf6ef23AA1024E07c3504824dd3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x2f", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xea763", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3", + "nonce": "0x30", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x842Ea41c15B32a8bcbDb17B5232b220e3B87082B", + "initCode": "608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", + "transactionIndex": "0xa", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x2361ed", + "gasUsed": "0x1a44b", + "contractAddress": "0xFC3a1F6577A8bCf6ef23AA1024E07c3504824dd3", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000000c3b6d36817500000000000000000000000000000000000000000000000000e7a003f14396a6c000000000000000000000000000000000000000000000a090f05abee315aabe40000000000000000000000000000000000000000000000000e793c8840d1531c000000000000000000000000000000000000000000000a090f066fa504c2c334", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", + "transactionHash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", + "transactionIndex": "0xa", + "logIndex": "0x33", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "transactionIndex": "0xb", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x2dfddd", + "gasUsed": "0xa9bf0", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000004f0b4fa2d01000000000000000000000000000000000000000000000000000e793c8840b70e6c000000000000000000000000000000000000000000000a090f066fa504c2c3340000000000000000000000000000000000000000000000000e744bd3468a0d6c000000000000000000000000000000000000000000000a090f0b6059feefc434", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", + "transactionHash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "transactionIndex": "0xb", + "logIndex": "0x34", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1685566229, + "chain": 80001, + "multi": false, + "commit": "55649c1" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json index e38f0309..f2eb4914 100644 --- a/broadcast/DeployKernel.s.sol/80001/run-latest.json +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -1,29 +1,46 @@ { "transactions": [ { - "hash": "0xc956eb87fe6d911b5e8f92967ec97ff0dbddae46c63397133787506029ed91f0", + "hash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", "transactionType": "CREATE", - "contractName": "KernelFactory", - "contractAddress": "0x1Afb5869e4e7d1023D5dEB324e9f869de0B571Db", + "contractName": "ERC721Actions", + "contractAddress": "0xFC3a1F6577A8bCf6ef23AA1024E07c3504824dd3", "function": null, - "arguments": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "rpc": "https://polygon-mumbai.infura.io/v3/c7efe98b44ba49a9a44b2933f52d3724", + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x2f", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "gas": "0x261d64", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xea763", "value": "0x0", - "data": "0x60a060405234801561001057600080fd5b506040516123d83803806123d883398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b611ae3806108f583390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b60805161080e6100e760003960008181604b0152818161012c0152818161024b01526102d6015261080e6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063037637aa146100465780630d253d76146100895780635fbfb9cf1461009c575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006d6100973660046103cd565b6100af565b61006d6100aa3660046103cd565b6101cc565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009081906054016040516020818303038152906040528051906020012090506101c28160405180602001610106906103c0565b601f1982820381018352601f9091011660408190526001600160a01b03881660248201527f0000000000000000000000000000000000000000000000000000000000000000906044015b60408051601f19818403018152918152602080830180516001600160e01b031663189acdbd60e31b179052905161018993929101610429565b60408051601f19818403018152908290526101a7929160200161046b565b60405160208183030381529060405280519060200120610382565b9150505b92915050565b6040516bffffffffffffffffffffffff19606084901b16602082015260348101829052600090819060540160405160208183030381529060405280519060200120905060006102738260405180602001610225906103c0565b601f1982820381018352601f9091011660408190526001600160a01b03891660248201527f000000000000000000000000000000000000000000000000000000000000000090604401610150565b90506001600160a01b0381163b1561028e5791506101c69050565b604080516001600160a01b03871660248083019190915282518083039091018152604490910182526020810180516001600160e01b031663189acdbd60e31b179052905183917f0000000000000000000000000000000000000000000000000000000000000000916102ff906103c0565b61030a929190610429565b8190604051809103906000f590508015801561032a573d6000803e3d6000fd5b509250846001600160a01b0316836001600160a01b03167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff8660405161037291815260200190565b60405180910390a3505092915050565b600061038f838330610396565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61033e8061049b83390190565b600080604083850312156103e057600080fd5b82356001600160a01b03811681146103f757600080fd5b946020939093013593505050565b60005b83811015610420578181015183820152602001610408565b50506000910152565b60018060a01b03831681526040602082015260008251806040840152610456816060850160208701610405565b601f01601f1916919091016060019392505050565b6000835161047d818460208801610405565b835190830190610491818360208801610405565b0194935050505056fe608060405260405161033e38038061033e833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6088806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fdfea26469706673582212209ab230fd9f4b12869e156e6154e1bc27a4d5b40951f1a135df8af03fdc09b1e964736f6c63430008130033a26469706673582212201855d12958a074b7ee8c5ec91dfd168ca17f21b5f65881a239a8e4ba47751c4964736f6c634300081300336101606040523480156200001257600080fd5b5060405162001ae338038062001ae3833981016040819052620000359162000186565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264302e302e3160d81b908201529151902060e08190527fae209a0b48f21c054280f2455d32cf309387644879d9acbd8ffc1991638118856101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000150565b80546001600160a01b0319166001600160a01b039290921691909117905550620001da9050565b6000806200018060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001b8565b92915050565b6000602082840312156200019957600080fd5b81516001600160a01b0381168114620001b157600080fd5b9392505050565b818103818111156200018057634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516118996200024a6000396000818161025f015281816103c40152818161048e01526107fc01526000610ef701526000610f4601526000610f2101526000610e7a01526000610ea401526000610ece01526118996000f3fe6080604052600436106100c65760003560e01c8063893d20e81161007f578063bc197c8111610059578063bc197c8114610281578063c4d66de8146102b0578063f23a6e61146102d0578063f333df55146102fd57600080fd5b8063893d20e814610200578063940d3c601461022d578063b0d691fe1461024d57600080fd5b806306fdde03146100d2578063150b7a021461011a5780631626ba7e1461015f5780633659cfe61461017f5780633a871cdd146101a157806354fd4d50146101cf57600080fd5b366100cd57005b600080fd5b3480156100de57600080fd5b506101046040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610111919061109e565b60405180910390f35b34801561012657600080fd5b5061014661013536600461110e565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610111565b34801561016b57600080fd5b5061014661017a36600461121e565b61031d565b34801561018b57600080fd5b5061019f61019a366004611264565b6103b9565b005b3480156101ad57600080fd5b506101c16101bc36600461127f565b610481565b604051908152602001610111565b3480156101db57600080fd5b5061010460405180604001604052806005815260200164302e302e3160d81b81525081565b34801561020c57600080fd5b506102156107d8565b6040516001600160a01b039091168152602001610111565b34801561023957600080fd5b5061019f6102483660046112d2565b6107f1565b34801561025957600080fd5b506102157f000000000000000000000000000000000000000000000000000000000000000081565b34801561028d57600080fd5b5061014661029c36600461138b565b63bc197c8160e01b98975050505050505050565b3480156102bc57600080fd5b5061019f6102cb366004611264565b610918565b3480156102dc57600080fd5b506101466102eb366004611445565b63f23a6e6160e01b9695505050505050565b34801561030957600080fd5b5061019f6103183660046114bc565b61099d565b600080610328610a0d565b90506103348484610a3b565b81546001600160a01b039182169116036103585750630b135d3f60e11b90506103b3565b600061036385610a5f565b905060006103718286610a3b565b83549091506001600160a01b0380831691160361039b5750630b135d3f60e11b92506103b3915050565b506001600160e01b031992506103b3915050565b5050505b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061040057506103f3610a0d565b546001600160a01b031633145b6104255760405162461bcd60e51b815260040161041c9061150e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104fb5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161041c565b610509610140850185611553565b90506041036105235761051c8484610ab2565b905061077f565b6061610533610140860186611553565b9050111561076657600061054b610140860186611553565b61055a91601491600091611599565b610563916115c3565b60601c90506000610578610140870187611553565b61058791601a91601491611599565b610590916115f8565b60d01c905060006105a5610140880188611553565b6105b491602091601a91611599565b6105bd916115f8565b60d01c905060006105d2610140890189611553565b6105e191606191602091611599565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939450610626925050506101408a018a611553565b610634916061908290611599565b8101906106419190611626565b508051602080830191909120604080517f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3938101939093526001600160a01b0389169083015265ffffffffffff80881660608401528616608083015260a08201529091506000906106ca9060c00160405160208183030381529060405280519060200120610b69565b905060006106d88285610a3b565b9050806001600160a01b03166106ec610a0d565b546001600160a01b03161461070b5760019750505050505050506107d1565b6000610719888d8d8d610bb7565b9050600081806020019051810190610731919061167f565b90508061074a57600199505050505050505050506107d1565b61075681158989610c35565b995050505050505050505061077f565b604051634be6321b60e01b815260040160405180910390fd5b81156107d157604051600090339084908381818185875af1925050503d80600081146107c7576040519150601f19603f3d011682016040523d82523d6000602084013e6107cc565b606091505b505050505b9392505050565b60006107e2610a0d565b546001600160a01b0316919050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610838575061082b610a0d565b546001600160a01b031633145b6108545760405162461bcd60e51b815260040161041c9061150e565b60006060600183600181111561086c5761086c6116a1565b036108bb576108b18786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c6d92505050565b9092509050610902565b6108fc878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ca392505050565b90925090505b8161090f57805160208201fd5b50505050505050565b6000610922610a0d565b80549091506001600160a01b03161561097d5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161041c565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806109e08585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c6d92505050565b915091508115610a05578060405163a52b216960e01b815260040161041c919061109e565b805160208201fd5b6000806103b360017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96116b7565b6000806000610a4a8585610cdb565b91509150610a5781610d20565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b600080610abd610a0d565b9050610b0b83610ad1610140870187611553565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a3b92505050565b81546001600160a01b03918216911603610b2557506103b3565b6000610b3084610a5f565b90506000610b4682610ad1610140890189611553565b83549091506001600160a01b038083169116146103af57600193505050506103b3565b60006103b3610b76610e6d565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60606000639e2045ce60e01b858585604051602401610bd893929190611746565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050600080610c198884610c6d565b9150915081610c2a57805160208201fd5b979650505050505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610c5d576000610c60565b60015b60ff161717949350505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b6000808251604103610d115760208301516040840151606085015160001a610d0587828585610f94565b94509450505050610d19565b506000905060025b9250929050565b6000816004811115610d3457610d346116a1565b03610d3c5750565b6001816004811115610d5057610d506116a1565b03610d9d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161041c565b6002816004811115610db157610db16116a1565b03610dfe5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161041c565b6003816004811115610e1257610e126116a1565b03610e6a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161041c565b50565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610ec657507f000000000000000000000000000000000000000000000000000000000000000046145b15610ef057507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fcb575060009050600361104f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561101f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110485760006001925092505061104f565b9150600090505b94509492505050565b6000815180845260005b8181101561107e57602081850181015186830182015201611062565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006107d16020830184611058565b80356001600160a01b03811681146110c857600080fd5b919050565b60008083601f8401126110df57600080fd5b5081356001600160401b038111156110f657600080fd5b602083019150836020828501011115610d1957600080fd5b60008060008060006080868803121561112657600080fd5b61112f866110b1565b945061113d602087016110b1565b93506040860135925060608601356001600160401b0381111561115f57600080fd5b61116b888289016110cd565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126111a357600080fd5b81356001600160401b03808211156111bd576111bd61117c565b604051601f8301601f19908116603f011681019082821181831017156111e5576111e561117c565b816040528381528660208588010111156111fe57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561123157600080fd5b8235915060208301356001600160401b0381111561124e57600080fd5b61125a85828601611192565b9150509250929050565b60006020828403121561127657600080fd5b6107d1826110b1565b60008060006060848603121561129457600080fd5b83356001600160401b038111156112aa57600080fd5b840161016081870312156112bd57600080fd5b95602085013595506040909401359392505050565b6000806000806000608086880312156112ea57600080fd5b6112f3866110b1565b94506020860135935060408601356001600160401b0381111561131557600080fd5b611321888289016110cd565b90945092505060608601356002811061133957600080fd5b809150509295509295909350565b60008083601f84011261135957600080fd5b5081356001600160401b0381111561137057600080fd5b6020830191508360208260051b8501011115610d1957600080fd5b60008060008060008060008060a0898b0312156113a757600080fd5b6113b0896110b1565b97506113be60208a016110b1565b965060408901356001600160401b03808211156113da57600080fd5b6113e68c838d01611347565b909850965060608b01359150808211156113ff57600080fd5b61140b8c838d01611347565b909650945060808b013591508082111561142457600080fd5b506114318b828c016110cd565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561145e57600080fd5b611467876110b1565b9550611475602088016110b1565b9450604087013593506060870135925060808701356001600160401b0381111561149e57600080fd5b6114aa89828a016110cd565b979a9699509497509295939492505050565b6000806000604084860312156114d157600080fd5b6114da846110b1565b925060208401356001600160401b038111156114f557600080fd5b611501868287016110cd565b9497909650939450505050565b60208082526025908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526437bbb732b960d91b606082015260800190565b6000808335601e1984360301811261156a57600080fd5b8301803591506001600160401b0382111561158457600080fd5b602001915036819003821315610d1957600080fd5b600080858511156115a957600080fd5b838611156115b657600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115f05780818660140360031b1b83161692505b505092915050565b6001600160d01b031981358181169160068510156115f05760069490940360031b84901b1690921692915050565b6000806040838503121561163957600080fd5b82356001600160401b038082111561165057600080fd5b61165c86838701611192565b9350602085013591508082111561167257600080fd5b5061125a85828601611192565b60006020828403121561169157600080fd5b815180151581146107d157600080fd5b634e487b7160e01b600052602160045260246000fd5b818103818111156103b357634e487b7160e01b600052601160045260246000fd5b6000808335601e198436030181126116ef57600080fd5b83016020810192503590506001600160401b0381111561170e57600080fd5b803603821315610d1957600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b606081526117676060820161175a866110b1565b6001600160a01b03169052565b60208401356080820152600061178060408601866116d8565b6101608060a08601526117986101c08601838561171d565b92506117a760608901896116d8565b9250605f19808786030160c08801526117c185858461171d565b945060808a013560e0880152610100935060a08a013584880152610120915060c08a01358288015261014060e08b013581890152848b013584890152611809838c018c6116d8565b95509350818887030161018089015261182386868661171d565b9550611831818c018c6116d8565b955093505080878603016101a0880152505061184e83838361171d565b6020860197909752505050506040015291905056fea264697066735822122034a298bc5764b008c2c8a88bc435affe2b7af4b0784ad3e6cc65ddcf18afc79764736f6c634300081300330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x8", + "data": "0x608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3", + "nonce": "0x30", "accessList": [] }, "additionalContracts": [ { - "transactionType": "CREATE", - "address": "0x0a5E9C6d689be2f0B35724ADb8633647D4c2Cefb", - "initCode": "6101606040523480156200001257600080fd5b5060405162001ae338038062001ae3833981016040819052620000359162000186565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264302e302e3160d81b908201529151902060e08190527fae209a0b48f21c054280f2455d32cf309387644879d9acbd8ffc1991638118856101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000150565b80546001600160a01b0319166001600160a01b039290921691909117905550620001da9050565b6000806200018060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001b8565b92915050565b6000602082840312156200019957600080fd5b81516001600160a01b0381168114620001b157600080fd5b9392505050565b818103818111156200018057634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516118996200024a6000396000818161025f015281816103c40152818161048e01526107fc01526000610ef701526000610f4601526000610f2101526000610e7a01526000610ea401526000610ece01526118996000f3fe6080604052600436106100c65760003560e01c8063893d20e81161007f578063bc197c8111610059578063bc197c8114610281578063c4d66de8146102b0578063f23a6e61146102d0578063f333df55146102fd57600080fd5b8063893d20e814610200578063940d3c601461022d578063b0d691fe1461024d57600080fd5b806306fdde03146100d2578063150b7a021461011a5780631626ba7e1461015f5780633659cfe61461017f5780633a871cdd146101a157806354fd4d50146101cf57600080fd5b366100cd57005b600080fd5b3480156100de57600080fd5b506101046040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610111919061109e565b60405180910390f35b34801561012657600080fd5b5061014661013536600461110e565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610111565b34801561016b57600080fd5b5061014661017a36600461121e565b61031d565b34801561018b57600080fd5b5061019f61019a366004611264565b6103b9565b005b3480156101ad57600080fd5b506101c16101bc36600461127f565b610481565b604051908152602001610111565b3480156101db57600080fd5b5061010460405180604001604052806005815260200164302e302e3160d81b81525081565b34801561020c57600080fd5b506102156107d8565b6040516001600160a01b039091168152602001610111565b34801561023957600080fd5b5061019f6102483660046112d2565b6107f1565b34801561025957600080fd5b506102157f000000000000000000000000000000000000000000000000000000000000000081565b34801561028d57600080fd5b5061014661029c36600461138b565b63bc197c8160e01b98975050505050505050565b3480156102bc57600080fd5b5061019f6102cb366004611264565b610918565b3480156102dc57600080fd5b506101466102eb366004611445565b63f23a6e6160e01b9695505050505050565b34801561030957600080fd5b5061019f6103183660046114bc565b61099d565b600080610328610a0d565b90506103348484610a3b565b81546001600160a01b039182169116036103585750630b135d3f60e11b90506103b3565b600061036385610a5f565b905060006103718286610a3b565b83549091506001600160a01b0380831691160361039b5750630b135d3f60e11b92506103b3915050565b506001600160e01b031992506103b3915050565b5050505b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061040057506103f3610a0d565b546001600160a01b031633145b6104255760405162461bcd60e51b815260040161041c9061150e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104fb5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161041c565b610509610140850185611553565b90506041036105235761051c8484610ab2565b905061077f565b6061610533610140860186611553565b9050111561076657600061054b610140860186611553565b61055a91601491600091611599565b610563916115c3565b60601c90506000610578610140870187611553565b61058791601a91601491611599565b610590916115f8565b60d01c905060006105a5610140880188611553565b6105b491602091601a91611599565b6105bd916115f8565b60d01c905060006105d2610140890189611553565b6105e191606191602091611599565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939450610626925050506101408a018a611553565b610634916061908290611599565b8101906106419190611626565b508051602080830191909120604080517f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3938101939093526001600160a01b0389169083015265ffffffffffff80881660608401528616608083015260a08201529091506000906106ca9060c00160405160208183030381529060405280519060200120610b69565b905060006106d88285610a3b565b9050806001600160a01b03166106ec610a0d565b546001600160a01b03161461070b5760019750505050505050506107d1565b6000610719888d8d8d610bb7565b9050600081806020019051810190610731919061167f565b90508061074a57600199505050505050505050506107d1565b61075681158989610c35565b995050505050505050505061077f565b604051634be6321b60e01b815260040160405180910390fd5b81156107d157604051600090339084908381818185875af1925050503d80600081146107c7576040519150601f19603f3d011682016040523d82523d6000602084013e6107cc565b606091505b505050505b9392505050565b60006107e2610a0d565b546001600160a01b0316919050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610838575061082b610a0d565b546001600160a01b031633145b6108545760405162461bcd60e51b815260040161041c9061150e565b60006060600183600181111561086c5761086c6116a1565b036108bb576108b18786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c6d92505050565b9092509050610902565b6108fc878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ca392505050565b90925090505b8161090f57805160208201fd5b50505050505050565b6000610922610a0d565b80549091506001600160a01b03161561097d5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161041c565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806109e08585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c6d92505050565b915091508115610a05578060405163a52b216960e01b815260040161041c919061109e565b805160208201fd5b6000806103b360017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96116b7565b6000806000610a4a8585610cdb565b91509150610a5781610d20565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b600080610abd610a0d565b9050610b0b83610ad1610140870187611553565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a3b92505050565b81546001600160a01b03918216911603610b2557506103b3565b6000610b3084610a5f565b90506000610b4682610ad1610140890189611553565b83549091506001600160a01b038083169116146103af57600193505050506103b3565b60006103b3610b76610e6d565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60606000639e2045ce60e01b858585604051602401610bd893929190611746565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050600080610c198884610c6d565b9150915081610c2a57805160208201fd5b979650505050505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610c5d576000610c60565b60015b60ff161717949350505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b6000808251604103610d115760208301516040840151606085015160001a610d0587828585610f94565b94509450505050610d19565b506000905060025b9250929050565b6000816004811115610d3457610d346116a1565b03610d3c5750565b6001816004811115610d5057610d506116a1565b03610d9d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161041c565b6002816004811115610db157610db16116a1565b03610dfe5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161041c565b6003816004811115610e1257610e126116a1565b03610e6a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161041c565b50565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610ec657507f000000000000000000000000000000000000000000000000000000000000000046145b15610ef057507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610fcb575060009050600361104f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561101f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110485760006001925092505061104f565b9150600090505b94509492505050565b6000815180845260005b8181101561107e57602081850181015186830182015201611062565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006107d16020830184611058565b80356001600160a01b03811681146110c857600080fd5b919050565b60008083601f8401126110df57600080fd5b5081356001600160401b038111156110f657600080fd5b602083019150836020828501011115610d1957600080fd5b60008060008060006080868803121561112657600080fd5b61112f866110b1565b945061113d602087016110b1565b93506040860135925060608601356001600160401b0381111561115f57600080fd5b61116b888289016110cd565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126111a357600080fd5b81356001600160401b03808211156111bd576111bd61117c565b604051601f8301601f19908116603f011681019082821181831017156111e5576111e561117c565b816040528381528660208588010111156111fe57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561123157600080fd5b8235915060208301356001600160401b0381111561124e57600080fd5b61125a85828601611192565b9150509250929050565b60006020828403121561127657600080fd5b6107d1826110b1565b60008060006060848603121561129457600080fd5b83356001600160401b038111156112aa57600080fd5b840161016081870312156112bd57600080fd5b95602085013595506040909401359392505050565b6000806000806000608086880312156112ea57600080fd5b6112f3866110b1565b94506020860135935060408601356001600160401b0381111561131557600080fd5b611321888289016110cd565b90945092505060608601356002811061133957600080fd5b809150509295509295909350565b60008083601f84011261135957600080fd5b5081356001600160401b0381111561137057600080fd5b6020830191508360208260051b8501011115610d1957600080fd5b60008060008060008060008060a0898b0312156113a757600080fd5b6113b0896110b1565b97506113be60208a016110b1565b965060408901356001600160401b03808211156113da57600080fd5b6113e68c838d01611347565b909850965060608b01359150808211156113ff57600080fd5b61140b8c838d01611347565b909650945060808b013591508082111561142457600080fd5b506114318b828c016110cd565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561145e57600080fd5b611467876110b1565b9550611475602088016110b1565b9450604087013593506060870135925060808701356001600160401b0381111561149e57600080fd5b6114aa89828a016110cd565b979a9699509497509295939492505050565b6000806000604084860312156114d157600080fd5b6114da846110b1565b925060208401356001600160401b038111156114f557600080fd5b611501868287016110cd565b9497909650939450505050565b60208082526025908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526437bbb732b960d91b606082015260800190565b6000808335601e1984360301811261156a57600080fd5b8301803591506001600160401b0382111561158457600080fd5b602001915036819003821315610d1957600080fd5b600080858511156115a957600080fd5b838611156115b657600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115f05780818660140360031b1b83161692505b505092915050565b6001600160d01b031981358181169160068510156115f05760069490940360031b84901b1690921692915050565b6000806040838503121561163957600080fd5b82356001600160401b038082111561165057600080fd5b61165c86838701611192565b9350602085013591508082111561167257600080fd5b5061125a85828601611192565b60006020828403121561169157600080fd5b815180151581146107d157600080fd5b634e487b7160e01b600052602160045260246000fd5b818103818111156103b357634e487b7160e01b600052601160045260246000fd5b6000808335601e198436030181126116ef57600080fd5b83016020810192503590506001600160401b0381111561170e57600080fd5b803603821315610d1957600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b606081526117676060820161175a866110b1565b6001600160a01b03169052565b60208401356080820152600061178060408601866116d8565b6101608060a08601526117986101c08601838561171d565b92506117a760608901896116d8565b9250605f19808786030160c08801526117c185858461171d565b945060808a013560e0880152610100935060a08a013584880152610120915060c08a01358288015261014060e08b013581890152848b013584890152611809838c018c6116d8565b95509350818887030161018089015261182386868661171d565b9550611831818c018c6116d8565b955093505080878603016101a0880152505061184e83838361171d565b6020860197909752505050506040015291905056fea264697066735822122034a298bc5764b008c2c8a88bc435affe2b7af4b0784ad3e6cc65ddcf18afc79764736f6c634300081300330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + "transactionType": "CREATE2", + "address": "0x842Ea41c15B32a8bcbDb17B5232b220e3B87082B", + "initCode": "608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3" } ], "isFixedGasLimit": false @@ -31,15 +48,48 @@ ], "receipts": [ { - "transactionHash": "0xc956eb87fe6d911b5e8f92967ec97ff0dbddae46c63397133787506029ed91f0", - "transactionIndex": "0x0", - "blockHash": "0x108fd9449710366ca1875c18ca909f4441b534353832c2039231095a9cd3a81a", - "blockNumber": "0x20a0bd2", + "transactionHash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", + "transactionIndex": "0xa", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": null, - "cumulativeGasUsed": "0x1d51b0", - "gasUsed": "0x1d51b0", - "contractAddress": "0x1Afb5869e4e7d1023D5dEB324e9f869de0B571Db", + "cumulativeGasUsed": "0x2361ed", + "gasUsed": "0x1a44b", + "contractAddress": "0xFC3a1F6577A8bCf6ef23AA1024E07c3504824dd3", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000000c3b6d36817500000000000000000000000000000000000000000000000000e7a003f14396a6c000000000000000000000000000000000000000000000a090f05abee315aabe40000000000000000000000000000000000000000000000000e793c8840d1531c000000000000000000000000000000000000000000000a090f066fa504c2c334", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", + "transactionHash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", + "transactionIndex": "0xa", + "logIndex": "0x33", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "transactionIndex": "0xb", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x2dfddd", + "gasUsed": "0xa9bf0", + "contractAddress": null, "logs": [ { "address": "0x0000000000000000000000000000000000001010", @@ -49,27 +99,26 @@ "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" ], - "data": "0x000000000000000000000000000000000000000000000000002221c52df096b000000000000000000000000000000000000000000000000001eac851fadc4b7a0000000000000000000000000000000000000000000005dce5f806daeebffe6a00000000000000000000000000000000000000000000000001c8a68cccebb4ca0000000000000000000000000000000000000000000005dce61a28a01cb0951a", - "blockHash": "0x108fd9449710366ca1875c18ca909f4441b534353832c2039231095a9cd3a81a", - "blockNumber": "0x20a0bd2", - "transactionHash": "0xc956eb87fe6d911b5e8f92967ec97ff0dbddae46c63397133787506029ed91f0", - "transactionIndex": "0x0", - "logIndex": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000004f0b4fa2d01000000000000000000000000000000000000000000000000000e793c8840b70e6c000000000000000000000000000000000000000000000a090f066fa504c2c3340000000000000000000000000000000000000000000000000e744bd3468a0d6c000000000000000000000000000000000000000000000a090f0b6059feefc434", + "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", + "blockNumber": "0x229a8af", + "transactionHash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "transactionIndex": "0xb", + "logIndex": "0x34", "removed": false } ], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x2", - "effectiveGasPrice": "0x12a05f200" + "effectiveGasPrice": "0x77359400" } ], "libraries": [], "pending": [], - "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", "returns": {}, - "timestamp": 1681156960, + "timestamp": 1685566229, "chain": 80001, "multi": false, - "commit": "48f665e" + "commit": "55649c1" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-1685599437.json b/broadcast/DeploySessionKey.s.sol/80001/run-1685599437.json new file mode 100644 index 00000000..0a829104 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/80001/run-1685599437.json @@ -0,0 +1,60 @@ +{ + "transactions": [ + { + "hash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "transactionType": "CREATE", + "contractName": "ERC721Actions", + "contractAddress": "0xc5580411041d96EC591d7fa4C57638E29F084b89", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x31", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x102c59", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89", + "nonce": "0x32", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xBd2EbA64275AA098D61420a75e30a3cE4B3D5F04", + "initCode": "608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a" + ], + "returns": {}, + "timestamp": 1685599437, + "chain": 80001, + "multi": false, + "commit": "1bfa1a7" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-1685599444.json b/broadcast/DeploySessionKey.s.sol/80001/run-1685599444.json new file mode 100644 index 00000000..44963525 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/80001/run-1685599444.json @@ -0,0 +1,124 @@ +{ + "transactions": [ + { + "hash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "transactionType": "CREATE", + "contractName": "ERC721Actions", + "contractAddress": "0xc5580411041d96EC591d7fa4C57638E29F084b89", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x31", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x102c59", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89", + "nonce": "0x32", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xBd2EbA64275AA098D61420a75e30a3cE4B3D5F04", + "initCode": "608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "transactionIndex": "0x1", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x86d24", + "gasUsed": "0x1a44b", + "contractAddress": "0xc5580411041d96EC591d7fa4C57638E29F084b89", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000000c3b6d36817500000000000000000000000000000000000000000000000000e744bd345e04e6c000000000000000000000000000000000000000000000a102d87c1768e870a300000000000000000000000000000000000000000000000000e73881c7278371c000000000000000000000000000000000000000000000a102d88852d61ef2180", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "transactionHash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "transactionIndex": "0x1", + "logIndex": "0x9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", + "transactionIndex": "0x2", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x137c26", + "gasUsed": "0xb0f02", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000005264a6d6637e00000000000000000000000000000000000000000000000000e73881c725df26c000000000000000000000000000000000000000000000a102d88852d61ef21800000000000000000000000000000000000000000000000000e6e61d204f7ba8c000000000000000000000000000000000000000000000a102d8dab77cf555960", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "transactionHash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", + "transactionIndex": "0x2", + "logIndex": "0xa", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1685599444, + "chain": 80001, + "multi": false, + "commit": "1bfa1a7" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-latest.json b/broadcast/DeploySessionKey.s.sol/80001/run-latest.json new file mode 100644 index 00000000..44963525 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/80001/run-latest.json @@ -0,0 +1,124 @@ +{ + "transactions": [ + { + "hash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "transactionType": "CREATE", + "contractName": "ERC721Actions", + "contractAddress": "0xc5580411041d96EC591d7fa4C57638E29F084b89", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "gas": "0x22261", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", + "nonce": "0x31", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x102c59", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89", + "nonce": "0x32", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xBd2EbA64275AA098D61420a75e30a3cE4B3D5F04", + "initCode": "608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "transactionIndex": "0x1", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": null, + "cumulativeGasUsed": "0x86d24", + "gasUsed": "0x1a44b", + "contractAddress": "0xc5580411041d96EC591d7fa4C57638E29F084b89", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000000c3b6d36817500000000000000000000000000000000000000000000000000e744bd345e04e6c000000000000000000000000000000000000000000000a102d87c1768e870a300000000000000000000000000000000000000000000000000e73881c7278371c000000000000000000000000000000000000000000000a102d88852d61ef2180", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "transactionHash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", + "transactionIndex": "0x1", + "logIndex": "0x9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + }, + { + "transactionHash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", + "transactionIndex": "0x2", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x137c26", + "gasUsed": "0xb0f02", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + ], + "data": "0x0000000000000000000000000000000000000000000000000005264a6d6637e00000000000000000000000000000000000000000000000000e73881c725df26c000000000000000000000000000000000000000000000a102d88852d61ef21800000000000000000000000000000000000000000000000000e6e61d204f7ba8c000000000000000000000000000000000000000000000a102d8dab77cf555960", + "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", + "blockNumber": "0x229e5bd", + "transactionHash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", + "transactionIndex": "0x2", + "logIndex": "0xa", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x77359400" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1685599444, + "chain": 80001, + "multi": false, + "commit": "1bfa1a7" +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 98436e34..94b88e8e 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,9 +3,10 @@ src = 'src' out = 'out' libs = ['lib'] remappings = ['account-abstraction/=lib/account-abstraction/contracts/'] +solc_version = '0.8.19' bytecode_hash = "none" cbor_metadata = false optimize = true runs = 1000000 -# See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file +# See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/hardhat.config.ts b/hardhat.config.ts index a6c8c5be..5e4a964e 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -4,6 +4,7 @@ import "@nomicfoundation/hardhat-foundry"; import "@nomiclabs/hardhat-ethers"; import "hardhat-deploy"; import '@typechain/hardhat' +import "./tasks/test_userOp" dotenv.config() diff --git a/lib/account-abstraction b/lib/account-abstraction index 9b5f2e4b..abff2aca 160000 --- a/lib/account-abstraction +++ b/lib/account-abstraction @@ -1 +1 @@ -Subproject commit 9b5f2e4bb30a81aa30761749d9e2e43fee64c768 +Subproject commit abff2aca61a8f0934e533d0d352978055fddbd96 diff --git a/package-lock.json b/package-lock.json index 226890ff..dc25237e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@zerodevapp/contracts", - "version": "3.0.0-rc.5", + "version": "4.0.0-beta.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@zerodevapp/contracts", - "version": "3.0.0-rc.5", + "version": "4.0.0-beta.8", "dependencies": { "@account-abstraction/contracts": "^0.6.0", "dotenv": "^16.0.3" }, "devDependencies": { "@nomicfoundation/hardhat-foundry": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.2.2", + "@nomiclabs/hardhat-ethers": "^2.2.3", "@typechain/ethers-v5": "^10.2.0", "@typechain/hardhat": "^6.1.5", "@types/chai": "^4.3.4", @@ -2289,9 +2289,9 @@ } }, "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", - "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", + "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", "dev": true, "peerDependencies": { "ethers": "^5.0.0", @@ -10266,9 +10266,9 @@ "optional": true }, "@nomiclabs/hardhat-ethers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", - "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", + "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 09bfda6f..408f70c8 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-foundry": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.2.2", + "@nomiclabs/hardhat-ethers": "^2.2.3", "@typechain/ethers-v5": "^10.2.0", "@typechain/hardhat": "^6.1.5", "@types/chai": "^4.3.4", diff --git a/scripts/DeployKernel.s.sol b/scripts/DeployKernel.s.sol index 1791fa0a..30ba81a2 100644 --- a/scripts/DeployKernel.s.sol +++ b/scripts/DeployKernel.s.sol @@ -1,12 +1,35 @@ pragma solidity ^0.8.0; import "src/factory/KernelFactory.sol"; +import "src/validator/ECDSAValidator.sol"; +import "src/factory/ECDSAKernelFactory.sol"; import "forge-std/Script.sol"; +import "forge-std/console.sol"; contract DeployKernel is Script { + address internal constant DETERMINISTIC_CREATE2_FACTORY = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); - KernelFactory factory = new KernelFactory(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)); + bytes memory bytecode = type(KernelFactory).creationCode; + bool success; + bytes memory returnData; + (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); + require(success, "Failed to deploy KernelFactory"); + console.logBytes(returnData); + address kernelFactory = address(bytes20(returnData)); + console.log("KernelFactory deployed at: %s", kernelFactory); + + bytecode = type(ECDSAValidator).creationCode; + (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode)); + require(success, "Failed to deploy ECDSAValidator"); + address validator = address(bytes20(returnData)); + console.log("ECDSAValidator deployed at: %s", validator); + + bytecode = type(ECDSAKernelFactory).creationCode; + (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(kernelFactory), abi.encode(validator), abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); + require(success, "Failed to deploy ECDSAKernelFactory"); + address ecdsaFactory = address(bytes20(returnData)); + console.log("ECDSAKernelFactory deployed at: %s", ecdsaFactory); vm.stopBroadcast(); } } diff --git a/scripts/DeploySessionKey.s.sol b/scripts/DeploySessionKey.s.sol new file mode 100644 index 00000000..ac521b38 --- /dev/null +++ b/scripts/DeploySessionKey.s.sol @@ -0,0 +1,25 @@ +pragma solidity ^0.8.0; + +import "src/factory/KernelFactory.sol"; +import "src/validator/ECDSAValidator.sol"; +import "src/factory/ECDSAKernelFactory.sol"; +import "src/executor/ERC721Actions.sol"; +import "src/validator/ERC165SessionKeyValidator.sol"; +import "forge-std/Script.sol"; +import "forge-std/console.sol"; +contract DeploySessionKey is Script { + address internal constant DETERMINISTIC_CREATE2_FACTORY = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; + function run() public { + uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(key); + ERC721Actions action = new ERC721Actions(); + + bytes memory bytecode = type(ERC165SessionKeyValidator).creationCode; + (bool success, bytes memory returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(action))); + require(success, "Failed to deploy ERC165SessionKeyValidator"); + address validator = address(bytes20(returnData)); + console.log("ERC165SessionKeyValidator deployed at: %s", validator); + vm.stopBroadcast(); + } +} + diff --git a/src/Kernel.sol b/src/Kernel.sol index 34a94a1d..655b2450 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -12,7 +12,6 @@ import "./abstract/Compatibility.sol"; import "./abstract/KernelStorage.sol"; import "./utils/KernelHelper.sol"; - /// @title Kernel /// @author taek /// @notice wallet kernel for minimal wallet functionality @@ -29,10 +28,10 @@ contract Kernel is IAccount, EIP712, Compatibility, KernelStorage { fallback() external payable { require(msg.sender == address(entryPoint), "account: not from entrypoint"); bytes4 sig = msg.sig; - address facet = getKernelStorage().execution[sig].executor; + address executor = getKernelStorage().execution[sig].executor; assembly { calldatacopy(0, 0, calldatasize()) - let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) + let result := delegatecall(gas(), executor, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 { revert(0, returndatasize()) } @@ -152,7 +151,7 @@ contract Kernel is IAccount, EIP712, Compatibility, KernelStorage { }); return (validationData, signature[88:88 + enableDataLength], validationSig); } - + /// @notice Checks if a signature is valid /// @dev This function checks if a signature is valid based on the hash of the data signed. /// @param hash The hash of the data that was signed diff --git a/src/abstract/KernelStorage.sol b/src/abstract/KernelStorage.sol index 25e46034..634c3ac5 100644 --- a/src/abstract/KernelStorage.sol +++ b/src/abstract/KernelStorage.sol @@ -87,7 +87,6 @@ contract KernelStorage { return entryPoint.getNonce(address(this), key); } - // query storage function getDefaultValidator() public view returns (IKernelValidator) { return getKernelStorage().defaultValidator; diff --git a/src/actions/ERC721Actions.sol b/src/executor/ERC721Actions.sol similarity index 100% rename from src/actions/ERC721Actions.sol rename to src/executor/ERC721Actions.sol diff --git a/src/factory/ECDSAKernelFactory.sol b/src/factory/ECDSAKernelFactory.sol index ab79f64b..eef57123 100644 --- a/src/factory/ECDSAKernelFactory.sol +++ b/src/factory/ECDSAKernelFactory.sol @@ -5,12 +5,14 @@ import "./KernelFactory.sol"; import "src/validator/ECDSAValidator.sol"; contract ECDSAKernelFactory { - KernelFactory immutable public singletonFactory; - ECDSAValidator immutable public validator; + KernelFactory public immutable singletonFactory; + ECDSAValidator public immutable validator; + IEntryPoint public immutable entryPoint; - constructor(KernelFactory _singletonFactory, ECDSAValidator _validator) { + constructor(KernelFactory _singletonFactory, ECDSAValidator _validator, IEntryPoint _entryPoint) { singletonFactory = _singletonFactory; validator = _validator; + entryPoint = _entryPoint; } function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) { diff --git a/src/factory/KernelFactory.sol b/src/factory/KernelFactory.sol index 812f961a..469cc5ee 100644 --- a/src/factory/KernelFactory.sol +++ b/src/factory/KernelFactory.sol @@ -6,23 +6,35 @@ import "./EIP1967Proxy.sol"; import "src/Kernel.sol"; import "src/validator/ECDSAValidator.sol"; +import "./TempKernel.sol"; + contract KernelFactory { - Kernel public immutable kernelTemplate; + TempKernel public immutable kernelTemplate; + Kernel public immutable nextTemplate; + IEntryPoint public immutable entryPoint; event AccountCreated(address indexed account, address indexed validator, bytes data, uint256 index); constructor(IEntryPoint _entryPoint) { - kernelTemplate = new Kernel(_entryPoint); + kernelTemplate = new TempKernel(_entryPoint); + nextTemplate = new Kernel(_entryPoint); + entryPoint = _entryPoint; } - function createAccount(IKernelValidator _validator, bytes calldata _data, uint256 _index) external returns (EIP1967Proxy proxy) { + function createAccount(IKernelValidator _validator, bytes calldata _data, uint256 _index) + external + returns (EIP1967Proxy proxy) + { bytes32 salt = keccak256(abi.encodePacked(_validator, _data, _index)); address addr = Create2.computeAddress( salt, keccak256( abi.encodePacked( type(EIP1967Proxy).creationCode, - abi.encode(address(kernelTemplate), abi.encodeCall(KernelStorage.initialize, (_validator, _data))) + abi.encode( + address(kernelTemplate), + abi.encodeCall(TempKernel.initialize, (_validator, address(nextTemplate), _data)) + ) ) ) ); @@ -30,20 +42,27 @@ contract KernelFactory { return EIP1967Proxy(payable(addr)); } proxy = - new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(KernelStorage.initialize.selector, _validator, _data)); + new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeCall(TempKernel.initialize, (_validator, address(nextTemplate), _data))); emit AccountCreated(address(proxy), address(_validator), _data, _index); } - function getAccountAddress(IKernelValidator _validator, bytes calldata _data, uint256 _index) public view returns (address) { + function getAccountAddress(IKernelValidator _validator, bytes calldata _data, uint256 _index) + public + view + returns (address) + { bytes32 salt = keccak256(abi.encodePacked(_validator, _data, _index)); return Create2.computeAddress( salt, keccak256( abi.encodePacked( type(EIP1967Proxy).creationCode, - abi.encode(address(kernelTemplate), abi.encodeCall(KernelStorage.initialize, (_validator, _data)) + abi.encode( + address(kernelTemplate), + abi.encodeCall(TempKernel.initialize, (_validator, address(nextTemplate), _data)) + ) ) ) - )); + ); } } diff --git a/src/factory/TempKernel.sol b/src/factory/TempKernel.sol new file mode 100644 index 00000000..e2fe92d1 --- /dev/null +++ b/src/factory/TempKernel.sol @@ -0,0 +1,228 @@ +pragma solidity ^0.8.0; + +import "account-abstraction/interfaces/IEntryPoint.sol"; +import "account-abstraction/interfaces/IAccount.sol"; +import "src/Kernel.sol"; +import "src/abstract/KernelStorage.sol"; + +bytes32 constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + +struct TempStorage { + address newTemplate; + address validator; + bytes data; + bytes validatorData; +} + +using ECDSA for bytes32; + +contract TempKernel is EIP712, IAccount { + string public constant name = "Kernel"; + + string public constant version = "0.0.2"; + + IEntryPoint public immutable entryPoint; + + /// @dev Sets up the EIP712 and KernelStorage with the provided entry point + constructor(IEntryPoint _entryPoint) EIP712(name, version) { + entryPoint = _entryPoint; + } + + // Function to initialize the wallet kernel + function initialize(IKernelValidator _defaultValidator, address _newTemplate, bytes calldata _data) external { + WalletKernelStorage storage ws = getKernelStorage(); + require(address(ws.defaultValidator) == address(0), "account: already initialized"); + ws.defaultValidator = _defaultValidator; + // _defaultValidator.enable(_data); removed to avoid accessing external storage + getStorage().newTemplate = _newTemplate; + getStorage().data = _data; + + (bool success,) = + _callCode(address(_defaultValidator), abi.encodeWithSelector(IKernelValidator.enable.selector, _data)); // to NOT preserve msg.sender + require(success, "account: enable failed with defaultvalidator"); + } + + function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) { + bytes32 storagePosition = bytes32(uint256(keccak256("zerodev.kernel")) - 1); + assembly { + ws.slot := storagePosition + } + } + + function getTempStorage() external view returns (address newTemplate, bytes memory data) { + TempStorage storage strg = getStorage(); + newTemplate = strg.newTemplate; + data = strg.data; + } + + function getStorage() internal view returns (TempStorage storage strg) { + assembly { + strg.slot := address() + } + } + + /// @notice Validates a user operation based on its mode + /// @dev This function will validate user operation and be called by EntryPoint + /// @param userOp The user operation to be validated + /// @param userOpHash The hash of the user operation + /// @param missingAccountFunds The funds needed to be reimbursed + /// @return validationData The data used for validation + function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) + external + returns (uint256 validationData) + { + require(msg.sender == address(entryPoint), "account: not from entryPoint"); + // mode based signature + bytes4 mode = bytes4(userOp.signature[0:4]); // mode == 00..00 use validators + // mode == 0x00000000 use sudo validator + // mode == 0x00000001 use given validator + // mode == 0x00000002 enable validator + UserOperation memory op = userOp; + IKernelValidator validator; + bytes4 sig = bytes4(userOp.callData[0:4]); + if (mode == 0x00000000) { + // sudo mode (use default validator) + op = userOp; + op.signature = userOp.signature[4:]; + validator = getKernelStorage().defaultValidator; + } else if (mode == 0x00000002) { + // no plugin mode + // use given validator + // userOp.signature[4:10] = validUntil, + // userOp.signature[10:16] = validAfter, + // userOp.signature[16:36] = validator address, + validator = IKernelValidator(address(bytes20(userOp.signature[16:36]))); + bytes calldata enableData; + bytes calldata remainSig; + (validationData, enableData, remainSig) = _approveValidator(sig, userOp.signature); + (bool s,) = + _callCode(address(validator), abi.encodeWithSelector(IKernelValidator.enable.selector, enableData)); // callcode for NOT preserving msg.sender + require(s, "account: enable mode enable failed"); + op.signature = remainSig; + } else { + return SIG_VALIDATION_FAILED; + } + if (missingAccountFunds > 0) { + // we are going to assume signature is valid at this point + (bool s,) = msg.sender.call{value: missingAccountFunds}(""); + (s); + } + (, bytes memory ret) = _callCode( + address(validator), + abi.encodeWithSelector(IKernelValidator.validateUserOp.selector, op, userOpHash, missingAccountFunds) + ); + validationData = _intersectValidationData(validationData, abi.decode(ret, (uint256))); + + return validationData; + } + + function _approveValidator(bytes4 sig, bytes calldata signature) + internal + returns (uint256 validationData, bytes calldata enableData, bytes calldata validationSig) + { + uint256 enableDataLength = uint256(bytes32(signature[56:88])); + enableData = signature[88:88 + enableDataLength]; + uint256 enableSignatureLength = uint256(bytes32(signature[88 + enableDataLength:120 + enableDataLength])); + bytes32 enableDigest = _hashTypedDataV4( + keccak256( + abi.encode( + keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), + bytes4(sig), + uint256(bytes32(signature[4:36])), + address(bytes20(signature[36:56])), + keccak256(enableData) + ) + ) + ); + (, bytes memory ret) = _callCode( + address(getKernelStorage().defaultValidator), + ( + abi.encodeWithSelector( + IKernelValidator.validateSignature.selector, + enableDigest, + signature[120 + enableDataLength:120 + enableDataLength + enableSignatureLength] + ) + ) + ); + validationData = _intersectValidationData( + abi.decode(ret, (uint256)), uint256(bytes32(signature[4:36])) & (uint256(type(uint96).max) << 160) + ); + validationSig = signature[120 + enableDataLength + enableSignatureLength:]; + getKernelStorage().execution[sig] = ExecutionDetail({ + executor: address(bytes20(signature[36:56])), + validator: IKernelValidator(address(bytes20(signature[16:36]))), + validUntil: uint48(bytes6(signature[4:10])), + validAfter: uint48(bytes6(signature[10:16])) + }); + getStorage().validator = address(bytes20(signature[16:36])); + getStorage().validatorData = enableData; + return (validationData, signature[88:88 + enableDataLength], validationSig); + } + + receive() external payable {} + + fallback() external payable { + TempStorage storage strg = getStorage(); + address _newImplementation = strg.newTemplate; + bytes32 slot = _IMPLEMENTATION_SLOT; + assembly { + sstore(slot, _newImplementation) + } // update implementation address for used on execution phase + + IKernelValidator defaultValidator = IKernelValidator(getKernelStorage().defaultValidator); + defaultValidator.enable(strg.data); + + IKernelValidator validator = IKernelValidator(getStorage().validator); + if (address(validator) != address(0)) { + validator.enable(getStorage().validatorData); + } + + (bool success, bytes memory ret) = _newImplementation.delegatecall(msg.data); + require(success, string(ret)); + } + + // WARTNING: this function is NOT VIEW + /// @notice Checks if a signature is valid + /// @dev This function checks if a signature is valid based on the hash of the data signed. + /// @param hash The hash of the data that was signed + /// @param signature The signature to be validated + /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. + function isValidSignature(bytes32 hash, bytes calldata signature) external returns (bytes4) { + (, bytes memory ret) = _callCode( + address(getKernelStorage().defaultValidator), + abi.encodeWithSelector(IKernelValidator.validateSignature.selector, hash, signature) + ); + uint256 validationData = abi.decode(ret, (uint256)); + ValidationData memory data = _parseValidationData(validationData); + if (data.validAfter > block.timestamp) { + return 0xffffffff; + } + if (data.validUntil < block.timestamp) { + return 0xffffffff; + } + if (data.aggregator != address(0)) { + return 0xffffffff; + } + + return 0x1626ba7e; + } + + function _callCode(address _target, bytes memory data) internal returns (bool success, bytes memory ret) { + assembly { + let result := callcode(gas(), _target, 0, add(data, 0x20), mload(data), 0, 0) + // Load free memory location + let ptr := mload(0x40) + // We allocate memory for the return data by setting the free memory location to + // current free memory location + data size + 32 bytes for data size value + mstore(0x40, add(ptr, add(returndatasize(), 0x20))) + // Store the size + mstore(ptr, returndatasize()) + // Store the data + returndatacopy(add(ptr, 0x20), 0, returndatasize()) + // Point the return data to the correct memory location + ret := ptr + success := result + } + require(success, string(ret)); + } +} diff --git a/src/test/TestExecutor.sol b/src/test/TestExecutor.sol index f720a674..0e97c42c 100644 --- a/src/test/TestExecutor.sol +++ b/src/test/TestExecutor.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; contract TestExecutor { event TestExecutorDoNothing(); + function doNothing() external { // do nothing emit TestExecutorDoNothing(); diff --git a/src/test/TestValidator.sol b/src/test/TestValidator.sol index a59d4cff..95299ef8 100644 --- a/src/test/TestValidator.sol +++ b/src/test/TestValidator.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import "src/validator/IValidator.sol"; -import "forge-std/console.sol"; contract TestValidator is IKernelValidator { event TestValidateUserOp(bytes32 indexed opHash); diff --git a/src/utils/KernelHelper.sol b/src/utils/KernelHelper.sol index 5a35715b..b78ca7cb 100644 --- a/src/utils/KernelHelper.sol +++ b/src/utils/KernelHelper.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; uint256 constant SIG_VALIDATION_FAILED = 1; function _intersectValidationData(uint256 a, uint256 b) pure returns (uint256 validationData) { - if(uint160(a) != uint160(b)) { + if (uint160(a) != uint160(b)) { return SIG_VALIDATION_FAILED; } uint48 validAfterA = uint48(a >> 160); diff --git a/src/validator/ECDSAValidator.sol b/src/validator/ECDSAValidator.sol index 1d465650..dada14e0 100644 --- a/src/validator/ECDSAValidator.sol +++ b/src/validator/ECDSAValidator.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import "./IValidator.sol"; import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; -import "forge-std/console.sol"; import "src/utils/KernelHelper.sol"; struct ECDSAValidatorStorage { diff --git a/src/validator/ERC165SessionKeyValidator.sol b/src/validator/ERC165SessionKeyValidator.sol index 44fcce4a..d976dfc3 100644 --- a/src/validator/ERC165SessionKeyValidator.sol +++ b/src/validator/ERC165SessionKeyValidator.sol @@ -6,9 +6,6 @@ import "openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol"; import "openzeppelin-contracts/contracts/utils/introspection/IERC165.sol"; import "src/utils/KernelHelper.sol"; -import "forge-std/console.sol"; - - // idea, we can make this merkle root struct ERC165SessionKeyStorage { bool enabled; @@ -20,7 +17,8 @@ struct ERC165SessionKeyStorage { } contract ERC165SessionKeyValidator is IKernelValidator { - mapping(address => mapping(address => ERC165SessionKeyStorage)) public sessionKeys; + mapping(address sessionKey => mapping(address kernel => ERC165SessionKeyStorage)) public sessionKeys; + function enable(bytes calldata _data) external { address sessionKey = address(bytes20(_data[0:20])); bytes4 interfaceId = bytes4(_data[20:24]); @@ -28,27 +26,33 @@ contract ERC165SessionKeyValidator is IKernelValidator { uint48 validUntil = uint48(bytes6(_data[28:34])); uint48 validAfter = uint48(bytes6(_data[34:40])); uint32 addressOffset = uint32(bytes4(_data[40:44])); - sessionKeys[msg.sender][sessionKey] = ERC165SessionKeyStorage(true, selector, interfaceId, validUntil, validAfter, addressOffset); + sessionKeys[sessionKey][msg.sender] = + ERC165SessionKeyStorage(true, selector, interfaceId, validUntil, validAfter, addressOffset); } function disable(bytes calldata _data) external { address sessionKey = address(bytes20(_data[0:20])); - delete sessionKeys[msg.sender][sessionKey]; + + delete sessionKeys[sessionKey][msg.sender]; } - function validateSignature(bytes32, bytes calldata) external pure override returns(uint256) { + function validateSignature(bytes32, bytes calldata) external pure override returns (uint256) { revert("not implemented"); } - function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external view returns(uint256){ + function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) + external + view + returns (uint256) + { bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); address recovered = ECDSA.recover(hash, _userOp.signature); - ERC165SessionKeyStorage storage sessionKey = sessionKeys[_userOp.sender][recovered]; + ERC165SessionKeyStorage storage sessionKey = sessionKeys[recovered][_userOp.sender]; if (!sessionKey.enabled) { return SIG_VALIDATION_FAILED; } require(bytes4(_userOp.callData[0:4]) == sessionKey.selector, "not supported selector"); - address token = address(bytes20(_userOp.callData[sessionKey.addressOffset:sessionKey.addressOffset+20])); + address token = address(bytes20(_userOp.callData[sessionKey.addressOffset:sessionKey.addressOffset + 20])); require(IERC165(token).supportsInterface(sessionKey.interfaceId), "does not support interface"); return (uint256(sessionKey.validAfter) << 160) | (uint256(sessionKey.validUntil) << (48 + 160)); } diff --git a/src/validator/KillSwitchValidator.sol b/src/validator/KillSwitchValidator.sol index fcfb4e5d..3840e310 100644 --- a/src/validator/KillSwitchValidator.sol +++ b/src/validator/KillSwitchValidator.sol @@ -17,7 +17,7 @@ struct KillSwitchValidatorStorage { contract KillSwitchValidator is IKernelValidator { mapping(address => KillSwitchValidatorStorage) public killSwitchValidatorStorage; - + function enable(bytes calldata enableData) external override { killSwitchValidatorStorage[msg.sender].owner = address(bytes20(enableData[0:20])); killSwitchValidatorStorage[msg.sender].guardian = address(bytes20(enableData[20:40])); @@ -29,14 +29,20 @@ contract KillSwitchValidator is IKernelValidator { function validateSignature(bytes32 hash, bytes calldata signature) external view override returns (uint256) { KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[msg.sender]; - return _packValidationData(validatorStorage.owner != ECDSA.recover(hash, signature), 0, validatorStorage.pausedUntil); + return _packValidationData( + validatorStorage.owner != ECDSA.recover(hash, signature), 0, validatorStorage.pausedUntil + ); } - function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external override returns (uint256) { + function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) + external + override + returns (uint256) + { address signer; bytes calldata signature; KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[_userOp.sender]; - if(_userOp.signature.length == 6 + 20 + 65) { + if (_userOp.signature.length == 6 + 65) { require(bytes4(_userOp.callData[0:4]) != KernelStorage.disableMode.selector); signer = validatorStorage.guardian; uint48 pausedUntil = uint48(bytes6(_userOp.signature[0:6])); @@ -47,8 +53,9 @@ contract KillSwitchValidator is IKernelValidator { signer = killSwitchValidatorStorage[_userOp.sender].owner; signature = _userOp.signature; } - if (signer == ECDSA.recover(_userOpHash, signature)) { // address(0) attack has been resolved in ECDSA library - return _packValidationData(false,0,validatorStorage.pausedUntil); + if (signer == ECDSA.recover(_userOpHash, signature)) { + // address(0) attack has been resolved in ECDSA library + return _packValidationData(false, 0, validatorStorage.pausedUntil); } bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); @@ -56,6 +63,6 @@ contract KillSwitchValidator is IKernelValidator { if (signer != recovered) { return SIG_VALIDATION_FAILED; } - return _packValidationData(false,0,validatorStorage.pausedUntil); + return _packValidationData(false, 0, validatorStorage.pausedUntil); } } diff --git a/src/validator/SessionKeyOwnedValidator.sol b/src/validator/SessionKeyOwnedValidator.sol new file mode 100644 index 00000000..0d30f64b --- /dev/null +++ b/src/validator/SessionKeyOwnedValidator.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./IValidator.sol"; +import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; +import "src/utils/KernelHelper.sol"; +import "account-abstraction/core/Helpers.sol"; + +struct SessionKeyStorage { + uint48 validUntil; + uint48 validAfter; +} + +contract SessionKeyOwnedValidator is IKernelValidator { + event OwnerChanged(address indexed kernel, address indexed oldOwner, address indexed newOwner); + + mapping(address sessionKey => mapping(address kernel => SessionKeyStorage)) public sessionKeyStorage; + + function disable(bytes calldata _data) external override { + address sessionKey = address(bytes20(_data[0:20])); + delete sessionKeyStorage[sessionKey][msg.sender]; + } + + function enable(bytes calldata _data) external override { + address sessionKey = address(bytes20(_data[0:20])); + uint48 validUntil = uint48(bytes6(_data[20:26])); + uint48 validAfter = uint48(bytes6(_data[26:32])); + require(validUntil > validAfter, "SessionKeyOwnedValidator: invalid validUntil/validAfter"); // we do not allow validUntil == 0 here use validUntil == 2**48-1 instead + sessionKeyStorage[sessionKey][msg.sender] = SessionKeyStorage(validUntil, validAfter); + } + + function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) + external + view + override + returns (uint256 validationData) + { + bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); + address recovered = ECDSA.recover(hash, _userOp.signature); + + SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; + if (sessionKey.validUntil == 0 ) { // we do not allow validUntil == 0 here + return SIG_VALIDATION_FAILED; + } + return _packValidationData(false, sessionKey.validUntil, sessionKey.validAfter); + } + + function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { + bytes32 ethhash = ECDSA.toEthSignedMessageHash(hash); + address recovered = ECDSA.recover(ethhash, signature); + + SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; + if (sessionKey.validUntil == 0 ) { // we do not allow validUntil == 0 here + return SIG_VALIDATION_FAILED; + } + return _packValidationData(false, sessionKey.validUntil, sessionKey.validAfter); + } +} diff --git a/tasks/test_userOp.ts b/tasks/test_userOp.ts new file mode 100644 index 00000000..46a1b5cc --- /dev/null +++ b/tasks/test_userOp.ts @@ -0,0 +1,102 @@ + +import { task } from "hardhat/config" +import { hexConcat, arrayify, hexZeroPad } from "ethers/lib/utils" + +const STACKUP = "https://api.stackup.sh/v1/node/65bdd496f420d5610b504691af2787cda9a580cd2be7d3fb64a78fc17bc65c42" + +task("test-userop-initcode", "deploy erc20 paymaster") + .setAction(async (taskArgs, hre) => { + const signer = (await hre.ethers.getSigners())[0]; + const addr = await signer.getAddress(); + console.log("signer address: ", addr); + const entrypoint = await hre.ethers.getContractAt("EntryPoint", "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"); + const ecdsaFactory = await hre.ethers.getContractAt("ECDSAKernelFactory", "0x08e627ca6a0593c807091726a7fbb2887a1cb556"); + const account = await ecdsaFactory.getAccountAddress(addr, 3); + const kernel = await hre.ethers.getContractAt("Kernel", account); + console.log("maxFeePerGas : ", await hre.ethers.provider.getGasPrice()); + const userOp = { + sender : account, + nonce : 0, + initCode : hexConcat([ecdsaFactory.address, ecdsaFactory.interface.encodeFunctionData("createAccount", [addr, 3])]), + callData : kernel.interface.encodeFunctionData("execute", [addr,0,"0x",0]), + callGasLimit : 100000, + verificationGasLimit : 300000, + preVerificationGas : 300000, + maxFeePerGas: (await hre.ethers.provider.getGasPrice()).toHexString(), + maxPriorityFeePerGas: 1000000000, + paymasterAndData: "0x", + signature: "0x" + } + if((await hre.ethers.provider.getBalance(account)).lt(hre.ethers.BigNumber.from("100000000000000000"))) { + console.log("insufficient balance"); + await signer.sendTransaction({ + to: account, + value: hre.ethers.BigNumber.from("100000000000000000") + }) + } + + const stackup = new hre.ethers.providers.JsonRpcProvider(STACKUP); + userOp.signature = hexConcat(["0x00000000", hexZeroPad("0xb1", 65)]) + const gas = await stackup.send("eth_estimateUserOperationGas", [userOp, entrypoint.address]); + console.log("gas: ", gas); + userOp.callGasLimit = gas.callGasLimit; + userOp.verificationGasLimit = gas.verificationGas; + userOp.preVerificationGas = gas.preVerificationGas; + const userOpHash = await entrypoint.getUserOpHash(userOp); + const userOpHashHex = arrayify(userOpHash); + const userOpSig = await signer.signMessage(userOpHashHex); + + console.log("userOpSig: ", userOpSig); + userOp.signature = hexConcat(["0x00000000", userOpSig]) + const receipt = await stackup.send("eth_sendUserOperation", [userOp, entrypoint.address]); + }) + +task("test-userop", "test userop") + .setAction(async (taskArgs, hre) => { + const kernel_id = 3; + const signer = (await hre.ethers.getSigners())[0]; + const addr = await signer.getAddress(); + console.log("signer address: ", addr); + const entrypoint = await hre.ethers.getContractAt("EntryPoint", "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"); + const ecdsaFactory = await hre.ethers.getContractAt("ECDSAKernelFactory", "0x08e627ca6a0593c807091726a7fbb2887a1cb556"); + const account = await ecdsaFactory.getAccountAddress(addr, kernel_id); + //await ecdsaFactory.createAccount(addr, kernel_id); + const kernel = await hre.ethers.getContractAt("Kernel", account); + console.log("maxFeePerGas : ", await hre.ethers.provider.getGasPrice()); + const userOp = { + sender : account, + nonce : (await entrypoint.getNonce(account,0)).toHexString(), + initCode : "0x", + callData : kernel.interface.encodeFunctionData("execute", [addr,0,"0x",0]), + callGasLimit : 100000, + verificationGasLimit : 300000, + preVerificationGas : 45100, + maxFeePerGas: (await hre.ethers.provider.getGasPrice()).toHexString(), + maxPriorityFeePerGas: 1000000000, + paymasterAndData: "0x", + signature: "0x" + } + if((await hre.ethers.provider.getBalance(account)).lt(hre.ethers.BigNumber.from("100000000000000000"))) { + console.log("insufficient balance"); + await signer.sendTransaction({ + to: account, + value: hre.ethers.BigNumber.from("100000000000000000") + }) + } + + const stackup = new hre.ethers.providers.JsonRpcProvider(STACKUP); + userOp.signature = hexConcat(["0x00000000", hexZeroPad("0x8f51af942b92e95ec77b4ae8b4197ca94373be26205746c506997587d0fd5efe6f5ea33ea7fcf09c9cd38216837c4739a8283d6f97e9977aa1f102fee5d0516b1b", 65)]) + const gas = await stackup.send("eth_estimateUserOperationGas", [userOp, entrypoint.address]); + console.log("gas: ", gas); + userOp.callGasLimit = gas.callGasLimit; + userOp.verificationGasLimit = gas.verificationGas; + userOp.preVerificationGas = gas.preVerificationGas; + const userOpHash = await entrypoint.getUserOpHash(userOp); + const userOpHashHex = arrayify(userOpHash); + const userOpSig = await signer.signMessage(userOpHashHex); + + console.log("userOpSig: ", userOpSig); + userOp.signature = hexConcat(["0x00000000", userOpSig]) + const receipt = await stackup.send("eth_sendUserOperation", [userOp, entrypoint.address]); + }) + diff --git a/test/foundry/Kernel.test.sol b/test/foundry/Kernel.test.sol index 4e66d03f..e0a931bd 100644 --- a/test/foundry/Kernel.test.sol +++ b/test/foundry/Kernel.test.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; import "src/factory/KernelFactory.sol"; +import "src/factory/TempKernel.sol"; import "src/factory/ECDSAKernelFactory.sol"; import "src/Kernel.sol"; import "src/validator/ECDSAValidator.sol"; @@ -30,9 +31,9 @@ contract KernelTest is Test { factory = new KernelFactory(entryPoint); validator = new ECDSAValidator(); - ecdsaFactory = new ECDSAKernelFactory(factory, validator); + ecdsaFactory = new ECDSAKernelFactory(factory, validator, entryPoint); - kernel = Kernel(payable(address(ecdsaFactory.createAccount(owner, 0)))); + kernel = Kernel(payable(ecdsaFactory.createAccount(owner, 0))); vm.deal(address(kernel), 1e30); beneficiary = payable(address(makeAddr("beneficiary"))); } @@ -47,7 +48,7 @@ contract KernelTest is Test { payable( address( new EIP1967Proxy( - address(factory.kernelTemplate()), + address(factory.nextTemplate()), abi.encodeWithSelector( KernelStorage.initialize.selector, validator, @@ -86,7 +87,8 @@ contract KernelTest is Test { function test_disable_mode() external { bytes memory empty; UserOperation memory op = entryPoint.fillUserOp( - address(kernel), abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) + address(kernel), + abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) ); op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); UserOperation[] memory ops = new UserOperation[](1); @@ -96,6 +98,7 @@ contract KernelTest is Test { } function test_set_execution() external { + console.log("owner", owner); TestValidator newValidator = new TestValidator(); UserOperation memory op = entryPoint.fillUserOp( address(kernel), @@ -119,4 +122,53 @@ contract KernelTest is Test { assertEq(uint256(execution.validUntil), uint256(0)); assertEq(uint256(execution.validAfter), uint256(0)); } + + function test_callcode() external { + CallCodeTester t = new CallCodeTester(); + address(t).call{value: 1e18}(""); + Target target = new Target(); + t.callcodeTest(address(target)); + console.log("target balance", address(target).balance); + console.log("t balance", address(t).balance); + console.log("t slot1", t.slot1()); + console.log("t slot2", t.slot2()); + } +} + +contract CallCodeTester { + uint256 public slot1; + uint256 public slot2; + receive() external payable { + } + function callcodeTest(address _target) external { + bool success; + bytes memory ret; + uint256 b = address(this).balance / 1000; + bytes memory data; + assembly { + let result := callcode(gas(), _target, b, add(data, 0x20), mload(data), 0, 0) + // Load free memory location + let ptr := mload(0x40) + // We allocate memory for the return data by setting the free memory location to + // current free memory location + data size + 32 bytes for data size value + mstore(0x40, add(ptr, add(returndatasize(), 0x20))) + // Store the size + mstore(ptr, returndatasize()) + // Store the data + returndatacopy(add(ptr, 0x20), 0, returndatasize()) + // Point the return data to the correct memory location + ret := ptr + success := result + } + require(success, "callcode failed"); + } +} + +contract Target { + uint256 public count; + uint256 public amount; + fallback() external payable { + count++; + amount += msg.value; + } } diff --git a/test/foundry/KernelExecution.test.sol b/test/foundry/KernelExecution.test.sol index 7fdfb342..1dbeb0e7 100644 --- a/test/foundry/KernelExecution.test.sol +++ b/test/foundry/KernelExecution.test.sol @@ -15,7 +15,7 @@ import "forge-std/Test.sol"; import {ERC4337Utils} from "./ERC4337Utils.sol"; // test actions/validators import "src/validator/ERC165SessionKeyValidator.sol"; -import "src/actions/ERC721Actions.sol"; +import "src/executor/ERC721Actions.sol"; using ERC4337Utils for EntryPoint; @@ -35,7 +35,7 @@ contract KernelExecutionTest is Test { factory = new KernelFactory(entryPoint); validator = new ECDSAValidator(); - ecdsaFactory = new ECDSAKernelFactory(factory, validator); + ecdsaFactory = new ECDSAKernelFactory(factory, validator, entryPoint); kernel = Kernel(payable(address(ecdsaFactory.createAccount(owner, 0)))); vm.deal(address(kernel), 1e30); @@ -45,7 +45,8 @@ contract KernelExecutionTest is Test { function test_revert_when_mode_disabled() external { bytes memory empty; UserOperation memory op = entryPoint.fillUserOp( - address(kernel), abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) + address(kernel), + abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) ); op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); UserOperation[] memory ops = new UserOperation[](1); @@ -151,45 +152,59 @@ contract KernelExecutionTest is Test { TestERC721 erc721 = new TestERC721(); erc721.mint(address(kernel), 0); erc721.mint(address(kernel), 1); - UserOperation memory op = - entryPoint.fillUserOp(address(kernel), abi.encodeWithSelector(ERC721Actions.transferERC721Action.selector, address(erc721), 0, address(0xdead))); + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(ERC721Actions.transferERC721Action.selector, address(erc721), 0, address(0xdead)) + ); address sessionKeyAddr; uint256 sessionKeyPriv; (sessionKeyAddr, sessionKeyPriv) = makeAddrAndKey("sessionKey"); - bytes memory enableData = abi.encodePacked(sessionKeyAddr, type(IERC721).interfaceId, ERC721Actions.transferERC721Action.selector, uint48(0), uint48(0), uint32(16)); - { - bytes32 digest = getTypedDataHash( - address(kernel), ERC721Actions.transferERC721Action.selector, 0, 0, address(sessionKeyValidator), address(action), - enableData - ); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); - - op.signature = abi.encodePacked( - bytes4(0x00000002), + bytes memory enableData = abi.encodePacked( + sessionKeyAddr, + type(IERC721).interfaceId, + ERC721Actions.transferERC721Action.selector, uint48(0), uint48(0), - address(sessionKeyValidator), - address(action), - uint256(enableData.length), - enableData, - uint256(65), - r, - s, - v + uint32(16) ); + { + bytes32 digest = getTypedDataHash( + address(kernel), + ERC721Actions.transferERC721Action.selector, + 0, + 0, + address(sessionKeyValidator), + address(action), + enableData + ); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); + + op.signature = abi.encodePacked( + bytes4(0x00000002), + uint48(0), + uint48(0), + address(sessionKeyValidator), + address(action), + uint256(enableData.length), + enableData, + uint256(65), + r, + s, + v + ); } - op.signature = bytes.concat( - op.signature, - entryPoint.signUserOpHash(vm, sessionKeyPriv, op) - ); + op.signature = bytes.concat(op.signature, entryPoint.signUserOpHash(vm, sessionKeyPriv, op)); UserOperation[] memory ops = new UserOperation[](1); ops[0] = op; logGas(op); entryPoint.handleOps(ops, beneficiary); - op = entryPoint.fillUserOp(address(kernel), abi.encodeWithSelector(ERC721Actions.transferERC721Action.selector, address(erc721), 1, address(0xdead))); + op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(ERC721Actions.transferERC721Action.selector, address(erc721), 1, address(0xdead)) + ); op.signature = abi.encodePacked(bytes4(0x00000001), entryPoint.signUserOpHash(vm, sessionKeyPriv, op)); ops[0] = op; logGas(op); @@ -198,7 +213,7 @@ contract KernelExecutionTest is Test { assertEq(erc721.ownerOf(0), address(0xdead)); } - function logGas(UserOperation memory op) internal returns(uint256 used) { + function logGas(UserOperation memory op) internal returns (uint256 used) { try this.consoleGasUsage(op) { revert("should revert"); } catch Error(string memory reason) { From 6f13ecb5355729a2339184cfacb5a7deafa979c9 Mon Sep 17 00:00:00 2001 From: taek Date: Sat, 10 Jun 2023 03:37:17 +0900 Subject: [PATCH 02/33] Feat/multi owned ecdsa (#8) * removed typescript deployments * fix : kernel helper * added multi ecdsa kernel factory * only owner --- deploy/deploy-all.ts | 45 ---- deployments/arbitrum/.chainId | 1 - deployments/arbitrum/KernelFactory.json | 140 ----------- .../arbitrum/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../d5c4a417af7f759d03a3c7da438dc2be.json | 135 ----------- deployments/arbitrumGoerli/.chainId | 1 - deployments/arbitrumGoerli/KernelFactory.json | 124 ---------- .../ZeroDevSessionKeyPlugin.json | 201 ---------------- .../b4f7aa20796f803709c4f0ee7de51b7f.json | 129 ----------- deployments/avalanche/.chainId | 1 - deployments/avalanche/KernelFactory.json | 140 ----------- .../avalanche/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../d5c4a417af7f759d03a3c7da438dc2be.json | 135 ----------- deployments/baseGoerli/.chainId | 1 - deployments/baseGoerli/KernelFactory.json | 140 ----------- .../baseGoerli/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../b4f7aa20796f803709c4f0ee7de51b7f.json | 129 ----------- deployments/bsc/.chainId | 1 - deployments/bsc/KernelFactory.json | 140 ----------- deployments/bsc/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../b4f7aa20796f803709c4f0ee7de51b7f.json | 129 ----------- deployments/bscTestnet/.chainId | 1 - deployments/bscTestnet/KernelFactory.json | 140 ----------- .../bscTestnet/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../b4f7aa20796f803709c4f0ee7de51b7f.json | 129 ----------- deployments/ethereum/.chainId | 1 - deployments/ethereum/KernelFactory.json | 140 ----------- .../ethereum/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../d5c4a417af7f759d03a3c7da438dc2be.json | 135 ----------- deployments/fuji/.chainId | 1 - deployments/fuji/KernelFactory.json | 140 ----------- deployments/fuji/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../d5c4a417af7f759d03a3c7da438dc2be.json | 135 ----------- deployments/goerli/.chainId | 1 - deployments/goerli/KernelFactory.json | 140 ----------- .../goerli/ZeroDevSessionKeyPlugin.json | 201 ---------------- .../d5c4a417af7f759d03a3c7da438dc2be.json | 135 ----------- deployments/mumbai/.chainId | 1 - deployments/mumbai/KernelFactory.json | 156 ------------- .../mumbai/ZeroDevSessionKeyPlugin.json | 217 ------------------ .../d5c4a417af7f759d03a3c7da438dc2be.json | 135 ----------- deployments/polygon/.chainId | 1 - deployments/polygon/KernelFactory.json | 156 ------------- .../polygon/ZeroDevSessionKeyPlugin.json | 217 ------------------ .../d5c4a417af7f759d03a3c7da438dc2be.json | 135 ----------- src/abstract/KernelStorage.sol | 2 +- src/factory/MultiECDSAKernelFactory.sol | 87 +++++++ src/interfaces/IAddressBook.sol | 6 + src/utils/KernelHelper.sol | 16 +- src/validator/MultiECDSAValidator.sol | 64 ++++++ test/foundry/KernelHelper.test.sol | 26 +++ test/foundry/KernelMultiOwned.test.sol | 157 +++++++++++++ 52 files changed, 352 insertions(+), 5322 deletions(-) delete mode 100644 deploy/deploy-all.ts delete mode 100644 deployments/arbitrum/.chainId delete mode 100644 deployments/arbitrum/KernelFactory.json delete mode 100644 deployments/arbitrum/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/arbitrum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json delete mode 100644 deployments/arbitrumGoerli/.chainId delete mode 100644 deployments/arbitrumGoerli/KernelFactory.json delete mode 100644 deployments/arbitrumGoerli/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/arbitrumGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json delete mode 100644 deployments/avalanche/.chainId delete mode 100644 deployments/avalanche/KernelFactory.json delete mode 100644 deployments/avalanche/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/avalanche/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json delete mode 100644 deployments/baseGoerli/.chainId delete mode 100644 deployments/baseGoerli/KernelFactory.json delete mode 100644 deployments/baseGoerli/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/baseGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json delete mode 100644 deployments/bsc/.chainId delete mode 100644 deployments/bsc/KernelFactory.json delete mode 100644 deployments/bsc/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/bsc/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json delete mode 100644 deployments/bscTestnet/.chainId delete mode 100644 deployments/bscTestnet/KernelFactory.json delete mode 100644 deployments/bscTestnet/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/bscTestnet/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json delete mode 100644 deployments/ethereum/.chainId delete mode 100644 deployments/ethereum/KernelFactory.json delete mode 100644 deployments/ethereum/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/ethereum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json delete mode 100644 deployments/fuji/.chainId delete mode 100644 deployments/fuji/KernelFactory.json delete mode 100644 deployments/fuji/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/fuji/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json delete mode 100644 deployments/goerli/.chainId delete mode 100644 deployments/goerli/KernelFactory.json delete mode 100644 deployments/goerli/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/goerli/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json delete mode 100644 deployments/mumbai/.chainId delete mode 100644 deployments/mumbai/KernelFactory.json delete mode 100644 deployments/mumbai/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/mumbai/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json delete mode 100644 deployments/polygon/.chainId delete mode 100644 deployments/polygon/KernelFactory.json delete mode 100644 deployments/polygon/ZeroDevSessionKeyPlugin.json delete mode 100644 deployments/polygon/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json create mode 100644 src/factory/MultiECDSAKernelFactory.sol create mode 100644 src/interfaces/IAddressBook.sol create mode 100644 src/validator/MultiECDSAValidator.sol create mode 100644 test/foundry/KernelHelper.test.sol create mode 100644 test/foundry/KernelMultiOwned.test.sol diff --git a/deploy/deploy-all.ts b/deploy/deploy-all.ts deleted file mode 100644 index 11fbac13..00000000 --- a/deploy/deploy-all.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { HardhatRuntimeEnvironment } from 'hardhat/types' -import { DeployFunction } from 'hardhat-deploy/types' - -// 0.6 -const entrypoint = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; - -const deployKernel: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployments, ethers } = hre; - const { deploy } = deployments; - const [deployer] = await ethers.getSigners(); - console.log("Deployer address: ", await deployer.getAddress()); - const deployerAddress = await deployer.getAddress(); - - const KernelFactory = await ethers.getContractFactory("KernelFactory"); - - // Create a contract instance without deploying - const contractInstance = KernelFactory.getDeployTransaction(entrypoint); - - // Estimate gas limit for the deployment transaction - const gasEstimate = await deployer.estimateGas(contractInstance); - - - // Retrieve the current gas price from the provider - const gasPrice = await deployer.provider!.getGasPrice(); - - console.log("Gas limit for deployment:", gasEstimate.toString()); - console.log("Current gas price:", gasPrice.toString()); - - - await deploy('KernelFactory', { - from: deployerAddress, - args: [entrypoint], - log: true, - deterministicDeployment: true, - }); - - await deploy('ZeroDevSessionKeyPlugin', { - from: deployerAddress, - log: true, - deterministicDeployment: true, - }); -} - -export default deployKernel -deployKernel.tags = ['ZeroDev'] \ No newline at end of file diff --git a/deployments/arbitrum/.chainId b/deployments/arbitrum/.chainId deleted file mode 100644 index 7df83ecb..00000000 --- a/deployments/arbitrum/.chainId +++ /dev/null @@ -1 +0,0 @@ -42161 \ No newline at end of file diff --git a/deployments/arbitrum/KernelFactory.json b/deployments/arbitrum/KernelFactory.json deleted file mode 100644 index 0933f682..00000000 --- a/deployments/arbitrum/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xcc99f182a598047e2b16d92459e04ac3f1c6ee3c7550cc546e2aad41f8ccf6fe", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "37893948", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x6cb89b7589b74efc4db91fc40459697e25b3e4fae4135297d97a29594d246786", - "transactionHash": "0xcc99f182a598047e2b16d92459e04ac3f1c6ee3c7550cc546e2aad41f8ccf6fe", - "logs": [], - "blockNumber": 81926710, - "cumulativeGasUsed": "37893948", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/arbitrum/ZeroDevSessionKeyPlugin.json b/deployments/arbitrum/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index 16744ecd..00000000 --- a/deployments/arbitrum/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x5f45aa2b47d17479406aa90750721f5ca39cbf2e456763ab4824bf3ca583be26", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "19840564", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xefcde13f9d160b0917e495e503670ff018f8139a9b840f36587d923ab2bd0ae4", - "transactionHash": "0x5f45aa2b47d17479406aa90750721f5ca39cbf2e456763ab4824bf3ca583be26", - "logs": [], - "blockNumber": 81926718, - "cumulativeGasUsed": "19840564", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/arbitrum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json b/deployments/arbitrum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json deleted file mode 100644 index 7cdf9e6e..00000000 --- a/deployments/arbitrum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/AccountFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./EIP1967Proxy.sol\";\nimport \"./MinimalAccount.sol\";\n\ncontract AccountFactory {\n MinimalAccount public immutable accountTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n accountTemplate = new MinimalAccount(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(accountTemplate), abi.encodeWithSelector(MinimalAccount.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/factory/MinimalAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"account-abstraction/interfaces/UserOperation.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"src/utils/Exec.sol\";\nimport \"src/abstract/KernelStorage.sol\";\nimport \"src/abstract/Compatibility.sol\";\n\ncontract MinimalAccount is IAccount, KernelStorage, Compatibility {\n error InvalidNonce();\n\n constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {}\n\n function initialize(address _owner) external {\n require(getKernelStorage().owner == address(0), \"Already initialized\");\n getKernelStorage().owner = _owner;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds)\n external\n returns (uint256)\n {\n require(msg.sender == address(entryPoint), \"account: not from entrypoint\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n\n if (missingFunds > 0) {\n (bool success,) = msg.sender.call{value: missingFunds}(\"\");\n (success);\n }\n return 0;\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/arbitrumGoerli/.chainId b/deployments/arbitrumGoerli/.chainId deleted file mode 100644 index 16be23a3..00000000 --- a/deployments/arbitrumGoerli/.chainId +++ /dev/null @@ -1 +0,0 @@ -421613 \ No newline at end of file diff --git a/deployments/arbitrumGoerli/KernelFactory.json b/deployments/arbitrumGoerli/KernelFactory.json deleted file mode 100644 index b51b35cf..00000000 --- a/deployments/arbitrumGoerli/KernelFactory.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/arbitrumGoerli/ZeroDevSessionKeyPlugin.json b/deployments/arbitrumGoerli/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index ed4e31bf..00000000 --- a/deployments/arbitrumGoerli/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x9a7b87919aff70c4cdc91ec0708265a63355bdbf540a7e6766bdbbb78146654b", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "39811357", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd4aa92397d61ce20898ef1878581f6e2fc2edce824b6a4fec65bd824b9b0872e", - "transactionHash": "0x9a7b87919aff70c4cdc91ec0708265a63355bdbf540a7e6766bdbbb78146654b", - "logs": [], - "blockNumber": 18851208, - "cumulativeGasUsed": "39811357", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/arbitrumGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json b/deployments/arbitrumGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json deleted file mode 100644 index d5d6537f..00000000 --- a/deployments/arbitrumGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/avalanche/.chainId b/deployments/avalanche/.chainId deleted file mode 100644 index 2d1acc42..00000000 --- a/deployments/avalanche/.chainId +++ /dev/null @@ -1 +0,0 @@ -43114 \ No newline at end of file diff --git a/deployments/avalanche/KernelFactory.json b/deployments/avalanche/KernelFactory.json deleted file mode 100644 index 06f38afd..00000000 --- a/deployments/avalanche/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x595058e2631957893924c91fc3ec117485a0aa4e85ae50a0efe7b03cf1cd5074", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 13, - "gasUsed": "3645194", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd28bedd0d0dcd8fe68f9ced8fceeeb823babd810145e6b6fcd7c381f24ea4009", - "transactionHash": "0x595058e2631957893924c91fc3ec117485a0aa4e85ae50a0efe7b03cf1cd5074", - "logs": [], - "blockNumber": 29002509, - "cumulativeGasUsed": "6986027", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/avalanche/ZeroDevSessionKeyPlugin.json b/deployments/avalanche/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index fc889581..00000000 --- a/deployments/avalanche/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x4913c31b1eb2a8078d00c552c6b1faa8db7cede29180054e09d4aeffcdd72207", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 8, - "gasUsed": "1716069", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7078a30239af4074c2743dbbcabd30dbe5f5eda2f04ce9a96dc1d1d3ed5e4e69", - "transactionHash": "0x4913c31b1eb2a8078d00c552c6b1faa8db7cede29180054e09d4aeffcdd72207", - "logs": [], - "blockNumber": 29002577, - "cumulativeGasUsed": "3156416", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/avalanche/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json b/deployments/avalanche/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json deleted file mode 100644 index 7cdf9e6e..00000000 --- a/deployments/avalanche/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/AccountFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./EIP1967Proxy.sol\";\nimport \"./MinimalAccount.sol\";\n\ncontract AccountFactory {\n MinimalAccount public immutable accountTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n accountTemplate = new MinimalAccount(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(accountTemplate), abi.encodeWithSelector(MinimalAccount.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/factory/MinimalAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"account-abstraction/interfaces/UserOperation.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"src/utils/Exec.sol\";\nimport \"src/abstract/KernelStorage.sol\";\nimport \"src/abstract/Compatibility.sol\";\n\ncontract MinimalAccount is IAccount, KernelStorage, Compatibility {\n error InvalidNonce();\n\n constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {}\n\n function initialize(address _owner) external {\n require(getKernelStorage().owner == address(0), \"Already initialized\");\n getKernelStorage().owner = _owner;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds)\n external\n returns (uint256)\n {\n require(msg.sender == address(entryPoint), \"account: not from entrypoint\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n\n if (missingFunds > 0) {\n (bool success,) = msg.sender.call{value: missingFunds}(\"\");\n (success);\n }\n return 0;\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/baseGoerli/.chainId b/deployments/baseGoerli/.chainId deleted file mode 100644 index 9b24bf02..00000000 --- a/deployments/baseGoerli/.chainId +++ /dev/null @@ -1 +0,0 @@ -84531 \ No newline at end of file diff --git a/deployments/baseGoerli/KernelFactory.json b/deployments/baseGoerli/KernelFactory.json deleted file mode 100644 index 23570846..00000000 --- a/deployments/baseGoerli/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x2ac80db42e6ee74d6cac152f55aa787d79908e5332d195abe991233916edba05", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 2, - "gasUsed": "3645194", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7500b674e126c4c2d8945a378d89fe28c70ec9c617ee663b2cc2eb75c2e6b112", - "transactionHash": "0x2ac80db42e6ee74d6cac152f55aa787d79908e5332d195abe991233916edba05", - "logs": [], - "blockNumber": 4035724, - "cumulativeGasUsed": "3853626", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/baseGoerli/ZeroDevSessionKeyPlugin.json b/deployments/baseGoerli/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index 371bf702..00000000 --- a/deployments/baseGoerli/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x8441c15195a2c6c7704d8b37291d8a3cd5ef0ce67554a975dd3388c3c163aa66", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1716069", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x2710210105efdd7632b954d758a43cd9ea112b1333b24a3080e4c86c0ac1f6f7", - "transactionHash": "0x8441c15195a2c6c7704d8b37291d8a3cd5ef0ce67554a975dd3388c3c163aa66", - "logs": [], - "blockNumber": 4035727, - "cumulativeGasUsed": "1762982", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/baseGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json b/deployments/baseGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json deleted file mode 100644 index d5d6537f..00000000 --- a/deployments/baseGoerli/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/bsc/.chainId b/deployments/bsc/.chainId deleted file mode 100644 index 2ebc6516..00000000 --- a/deployments/bsc/.chainId +++ /dev/null @@ -1 +0,0 @@ -56 \ No newline at end of file diff --git a/deployments/bsc/KernelFactory.json b/deployments/bsc/KernelFactory.json deleted file mode 100644 index 94a032a2..00000000 --- a/deployments/bsc/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x1996d155cecf7ce4fef4cae9dbbc69ad6a11ccf807d17d7bb9fe3b23b4563442", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 60, - "gasUsed": "3643894", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7848f7cbc5c9bf4a0c6c4560593600bbe9e672c1dd493726ec70674e9ff9e5af", - "transactionHash": "0x1996d155cecf7ce4fef4cae9dbbc69ad6a11ccf807d17d7bb9fe3b23b4563442", - "logs": [], - "blockNumber": 27931519, - "cumulativeGasUsed": "9373259", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/bsc/ZeroDevSessionKeyPlugin.json b/deployments/bsc/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index d40d77b4..00000000 --- a/deployments/bsc/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x53112219e534e41a623afa236976e25b64646934f66d924345e8be166d31f534", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 55, - "gasUsed": "1716069", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x0156605cb8af3f6350be377c028adc6eda0025e52d2ee34e21503cc1c9b3b534", - "transactionHash": "0x53112219e534e41a623afa236976e25b64646934f66d924345e8be166d31f534", - "logs": [], - "blockNumber": 27931521, - "cumulativeGasUsed": "5705224", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/bsc/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json b/deployments/bsc/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json deleted file mode 100644 index d5d6537f..00000000 --- a/deployments/bsc/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/bscTestnet/.chainId b/deployments/bscTestnet/.chainId deleted file mode 100644 index c4fbb1cf..00000000 --- a/deployments/bscTestnet/.chainId +++ /dev/null @@ -1 +0,0 @@ -97 \ No newline at end of file diff --git a/deployments/bscTestnet/KernelFactory.json b/deployments/bscTestnet/KernelFactory.json deleted file mode 100644 index 1d2dfea6..00000000 --- a/deployments/bscTestnet/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xe062f483e0ab89ea81891b011cd00aac790304f0daa6a3c704073e0b6b9a3b76", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 7, - "gasUsed": "3643894", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x6d883639e00b01f598ffbc7b33e383283ecf0e0efc3c5e94a8ff3321c50aa7b2", - "transactionHash": "0xe062f483e0ab89ea81891b011cd00aac790304f0daa6a3c704073e0b6b9a3b76", - "logs": [], - "blockNumber": 29514611, - "cumulativeGasUsed": "4144964", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/bscTestnet/ZeroDevSessionKeyPlugin.json b/deployments/bscTestnet/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index 87a4b7b6..00000000 --- a/deployments/bscTestnet/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xa98daaa692b5c605213569431746f4f70fd5ec75037ff33047f4d1ff1a633d2a", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 5, - "gasUsed": "1716069", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x54b2ecbca76323ab9ca0d24e2e124ba4589bb1de539880b21e6176b0c90875fd", - "transactionHash": "0xa98daaa692b5c605213569431746f4f70fd5ec75037ff33047f4d1ff1a633d2a", - "logs": [], - "blockNumber": 29514650, - "cumulativeGasUsed": "2009244", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "b4f7aa20796f803709c4f0ee7de51b7f", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/bscTestnet/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json b/deployments/bscTestnet/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json deleted file mode 100644 index d5d6537f..00000000 --- a/deployments/bscTestnet/solcInputs/b4f7aa20796f803709c4f0ee7de51b7f.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/ethereum/.chainId b/deployments/ethereum/.chainId deleted file mode 100644 index 56a6051c..00000000 --- a/deployments/ethereum/.chainId +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/deployments/ethereum/KernelFactory.json b/deployments/ethereum/KernelFactory.json deleted file mode 100644 index 416d161e..00000000 --- a/deployments/ethereum/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x93dea01df0e1ee151e42e5561206b8a427ee05756040791009980be4bd474020", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 107, - "gasUsed": "3647178", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x31c1f54016e64df35449cd8269a2076e11b0931834c729357786d051cdd25a59", - "transactionHash": "0x93dea01df0e1ee151e42e5561206b8a427ee05756040791009980be4bd474020", - "logs": [], - "blockNumber": 17089592, - "cumulativeGasUsed": "14629210", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/ethereum/ZeroDevSessionKeyPlugin.json b/deployments/ethereum/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index 497e0d0b..00000000 --- a/deployments/ethereum/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x281ba4d20ac0f473407432e05d62263ca2e4456d6c1d96f329f12d619a10ff69", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 129, - "gasUsed": "1716591", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x8f7c97fb14390184ebd72ffd13944655a88b21441d2085a811163902b814d6df", - "transactionHash": "0x281ba4d20ac0f473407432e05d62263ca2e4456d6c1d96f329f12d619a10ff69", - "logs": [], - "blockNumber": 17089647, - "cumulativeGasUsed": "13416706", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/ethereum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json b/deployments/ethereum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json deleted file mode 100644 index 7cdf9e6e..00000000 --- a/deployments/ethereum/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/AccountFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./EIP1967Proxy.sol\";\nimport \"./MinimalAccount.sol\";\n\ncontract AccountFactory {\n MinimalAccount public immutable accountTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n accountTemplate = new MinimalAccount(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(accountTemplate), abi.encodeWithSelector(MinimalAccount.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/factory/MinimalAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"account-abstraction/interfaces/UserOperation.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"src/utils/Exec.sol\";\nimport \"src/abstract/KernelStorage.sol\";\nimport \"src/abstract/Compatibility.sol\";\n\ncontract MinimalAccount is IAccount, KernelStorage, Compatibility {\n error InvalidNonce();\n\n constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {}\n\n function initialize(address _owner) external {\n require(getKernelStorage().owner == address(0), \"Already initialized\");\n getKernelStorage().owner = _owner;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds)\n external\n returns (uint256)\n {\n require(msg.sender == address(entryPoint), \"account: not from entrypoint\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n\n if (missingFunds > 0) {\n (bool success,) = msg.sender.call{value: missingFunds}(\"\");\n (success);\n }\n return 0;\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/fuji/.chainId b/deployments/fuji/.chainId deleted file mode 100644 index a7350c72..00000000 --- a/deployments/fuji/.chainId +++ /dev/null @@ -1 +0,0 @@ -43113 \ No newline at end of file diff --git a/deployments/fuji/KernelFactory.json b/deployments/fuji/KernelFactory.json deleted file mode 100644 index 6caa6d36..00000000 --- a/deployments/fuji/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x9e85c02f6d7bfacaf570123d036d464795605f27d37009caca483178e05f1753", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 0, - "gasUsed": "3645194", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x59faa1e2b248d9e07cd30b05f1d20f1dd7f44af97150c49fbd3558fb8c85f03f", - "transactionHash": "0x9e85c02f6d7bfacaf570123d036d464795605f27d37009caca483178e05f1753", - "logs": [], - "blockNumber": 21093601, - "cumulativeGasUsed": "3645194", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/fuji/ZeroDevSessionKeyPlugin.json b/deployments/fuji/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index 183a7bcc..00000000 --- a/deployments/fuji/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xdc7ad66652932550d057cb917ab3e72384a177ab6b1160c90bc2cf4876910468", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 0, - "gasUsed": "1716069", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x31c2c2de7c2d612fc3b2a4aa4a41e0f4f03d48d27d91e2f03ed26483c81ef13c", - "transactionHash": "0xdc7ad66652932550d057cb917ab3e72384a177ab6b1160c90bc2cf4876910468", - "logs": [], - "blockNumber": 21093604, - "cumulativeGasUsed": "1716069", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/fuji/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json b/deployments/fuji/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json deleted file mode 100644 index 7cdf9e6e..00000000 --- a/deployments/fuji/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/AccountFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./EIP1967Proxy.sol\";\nimport \"./MinimalAccount.sol\";\n\ncontract AccountFactory {\n MinimalAccount public immutable accountTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n accountTemplate = new MinimalAccount(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(accountTemplate), abi.encodeWithSelector(MinimalAccount.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/factory/MinimalAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"account-abstraction/interfaces/UserOperation.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"src/utils/Exec.sol\";\nimport \"src/abstract/KernelStorage.sol\";\nimport \"src/abstract/Compatibility.sol\";\n\ncontract MinimalAccount is IAccount, KernelStorage, Compatibility {\n error InvalidNonce();\n\n constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {}\n\n function initialize(address _owner) external {\n require(getKernelStorage().owner == address(0), \"Already initialized\");\n getKernelStorage().owner = _owner;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds)\n external\n returns (uint256)\n {\n require(msg.sender == address(entryPoint), \"account: not from entrypoint\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n\n if (missingFunds > 0) {\n (bool success,) = msg.sender.call{value: missingFunds}(\"\");\n (success);\n }\n return 0;\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/goerli/.chainId b/deployments/goerli/.chainId deleted file mode 100644 index 7813681f..00000000 --- a/deployments/goerli/.chainId +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/deployments/goerli/KernelFactory.json b/deployments/goerli/KernelFactory.json deleted file mode 100644 index 90c48d0a..00000000 --- a/deployments/goerli/KernelFactory.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x3ed20b66444642994e2470949282e526f996f4b3a063351d8cc92b92cb43d307", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 46, - "gasUsed": "3647178", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xf50a9dfd9def35ca0d97a7875568a3b452c3d9084cf931290ad4e9ba3fbd669b", - "transactionHash": "0x3ed20b66444642994e2470949282e526f996f4b3a063351d8cc92b92cb43d307", - "logs": [], - "blockNumber": 8831456, - "cumulativeGasUsed": "10705431", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/goerli/ZeroDevSessionKeyPlugin.json b/deployments/goerli/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index 10b752e2..00000000 --- a/deployments/goerli/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x41f8c3020c343455613bfa407145b6b4cc90d235764b3aea7ed96191ca7b75d3", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 27, - "gasUsed": "1716591", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x2e99579b730324decace81ac5e73d6af456495f99c13131bdaa0ae38ad647714", - "transactionHash": "0x41f8c3020c343455613bfa407145b6b4cc90d235764b3aea7ed96191ca7b75d3", - "logs": [], - "blockNumber": 8831457, - "cumulativeGasUsed": "4285746", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/goerli/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json b/deployments/goerli/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json deleted file mode 100644 index 7cdf9e6e..00000000 --- a/deployments/goerli/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/AccountFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./EIP1967Proxy.sol\";\nimport \"./MinimalAccount.sol\";\n\ncontract AccountFactory {\n MinimalAccount public immutable accountTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n accountTemplate = new MinimalAccount(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(accountTemplate), abi.encodeWithSelector(MinimalAccount.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/factory/MinimalAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"account-abstraction/interfaces/UserOperation.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"src/utils/Exec.sol\";\nimport \"src/abstract/KernelStorage.sol\";\nimport \"src/abstract/Compatibility.sol\";\n\ncontract MinimalAccount is IAccount, KernelStorage, Compatibility {\n error InvalidNonce();\n\n constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {}\n\n function initialize(address _owner) external {\n require(getKernelStorage().owner == address(0), \"Already initialized\");\n getKernelStorage().owner = _owner;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds)\n external\n returns (uint256)\n {\n require(msg.sender == address(entryPoint), \"account: not from entrypoint\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n\n if (missingFunds > 0) {\n (bool success,) = msg.sender.call{value: missingFunds}(\"\");\n (success);\n }\n return 0;\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/mumbai/.chainId b/deployments/mumbai/.chainId deleted file mode 100644 index d7e2f72c..00000000 --- a/deployments/mumbai/.chainId +++ /dev/null @@ -1 +0,0 @@ -80001 \ No newline at end of file diff --git a/deployments/mumbai/KernelFactory.json b/deployments/mumbai/KernelFactory.json deleted file mode 100644 index 9454db02..00000000 --- a/deployments/mumbai/KernelFactory.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xcf947450b9693087cbfbe080afd3e2388406334855b716d47591f5d592d6522e", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 0, - "gasUsed": "3645194", - "logsBloom": "0x00000000000000020000000000000000000000000000000000000004000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000020000000000000000001000000000000000000000000004000000000000000000041000000000000000000000000000000100000000000000000000000000000000000000000000800000000000000000000000000100000", - "blockHash": "0x32b51a0e5d985bf4d2038b79b0505fe098b973ab31cf677cf42f3e0415c0500a", - "transactionHash": "0xcf947450b9693087cbfbe080afd3e2388406334855b716d47591f5d592d6522e", - "logs": [ - { - "transactionIndex": 0, - "blockNumber": 34382565, - "transactionHash": "0xcf947450b9693087cbfbe080afd3e2388406334855b716d47591f5d592d6522e", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x0000000000000000000000008d8a9cf53b7d95c148cb159384d249f8fb68db3f", - "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" - ], - "data": "0x000000000000000000000000000000000000000000000000002288c25d50df4c000000000000000000000000000000000000000000000000002c4f5f8db36981000000000000000000000000000000000000000000001db94968cf6b1d2a1d920000000000000000000000000000000000000000000000000009c69d30628a35000000000000000000000000000000000000000000001db9498b582d7a7afcde", - "logIndex": 0, - "blockHash": "0x32b51a0e5d985bf4d2038b79b0505fe098b973ab31cf677cf42f3e0415c0500a" - } - ], - "blockNumber": 34382565, - "cumulativeGasUsed": "3645194", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/mumbai/ZeroDevSessionKeyPlugin.json b/deployments/mumbai/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index 19f91099..00000000 --- a/deployments/mumbai/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x949408c75a94ea3ba9d16f9f47eb1a88fd5b7ec855ef2d233917f8327104e241", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 7, - "gasUsed": "1716069", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000080000000000000000000000000000000000000000004000000000000000000041000000000100000000000000000000100000000000000000000000000000000000000000000800000000000000000000000000100000", - "blockHash": "0x934e0c80cf019d6df6fc7b448eb7d0104812ce5c18ffe0c635fd72d377946bfa", - "transactionHash": "0x949408c75a94ea3ba9d16f9f47eb1a88fd5b7ec855ef2d233917f8327104e241", - "logs": [ - { - "transactionIndex": 7, - "blockNumber": 34382609, - "transactionHash": "0x949408c75a94ea3ba9d16f9f47eb1a88fd5b7ec855ef2d233917f8327104e241", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x0000000000000000000000008d8a9cf53b7d95c148cb159384d249f8fb68db3f", - "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" - ], - "data": "0x000000000000000000000000000000000000000000000000000fc5279b03ef7500000000000000000000000000000000000000000000000009c0ace7bbe6389f0000000000000000000000000000000000000000000006230aa71fae9528c3ee00000000000000000000000000000000000000000000000009b0e7c020e2492a0000000000000000000000000000000000000000000006230ab6e4d6302cb363", - "logIndex": 15, - "blockHash": "0x934e0c80cf019d6df6fc7b448eb7d0104812ce5c18ffe0c635fd72d377946bfa" - } - ], - "blockNumber": 34382609, - "cumulativeGasUsed": "6936699", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/mumbai/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json b/deployments/mumbai/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json deleted file mode 100644 index 7cdf9e6e..00000000 --- a/deployments/mumbai/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/AccountFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./EIP1967Proxy.sol\";\nimport \"./MinimalAccount.sol\";\n\ncontract AccountFactory {\n MinimalAccount public immutable accountTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n accountTemplate = new MinimalAccount(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(accountTemplate), abi.encodeWithSelector(MinimalAccount.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/factory/MinimalAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"account-abstraction/interfaces/UserOperation.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"src/utils/Exec.sol\";\nimport \"src/abstract/KernelStorage.sol\";\nimport \"src/abstract/Compatibility.sol\";\n\ncontract MinimalAccount is IAccount, KernelStorage, Compatibility {\n error InvalidNonce();\n\n constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {}\n\n function initialize(address _owner) external {\n require(getKernelStorage().owner == address(0), \"Already initialized\");\n getKernelStorage().owner = _owner;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds)\n external\n returns (uint256)\n {\n require(msg.sender == address(entryPoint), \"account: not from entrypoint\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n\n if (missingFunds > 0) {\n (bool success,) = msg.sender.call{value: missingFunds}(\"\");\n (success);\n }\n return 0;\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/deployments/polygon/.chainId b/deployments/polygon/.chainId deleted file mode 100644 index 0973804c..00000000 --- a/deployments/polygon/.chainId +++ /dev/null @@ -1 +0,0 @@ -137 \ No newline at end of file diff --git a/deployments/polygon/KernelFactory.json b/deployments/polygon/KernelFactory.json deleted file mode 100644 index 2cd9bcb9..00000000 --- a/deployments/polygon/KernelFactory.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "address": "0x4E4946298614FC299B50c947289F4aD0572CB9ce", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "_entryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "createAccount", - "outputs": [ - { - "internalType": "contract EIP1967Proxy", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAccountAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "kernelTemplate", - "outputs": [ - { - "internalType": "contract Kernel", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xe7132a1f7958c489dca601a1809acb99fca61a74f7854dc41b5c11541a570510", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 33, - "gasUsed": "3645194", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000008000000000000000000000000000000000000000000020000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000008000004000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000041000000000000000000000000000000100000000000000000000000000000000000000000000800000000000000000000000000100000", - "blockHash": "0xf689ba7cfe2c01e2a799b589292f2d463acb200bffdc36ad7364adba7b03d694", - "transactionHash": "0xe7132a1f7958c489dca601a1809acb99fca61a74f7854dc41b5c11541a570510", - "logs": [ - { - "transactionIndex": 33, - "blockNumber": 41756612, - "transactionHash": "0xe7132a1f7958c489dca601a1809acb99fca61a74f7854dc41b5c11541a570510", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x0000000000000000000000008d8a9cf53b7d95c148cb159384d249f8fb68db3f", - "0x000000000000000000000000b2dd091ea6e591d62f565d7a18ce2a7640add227" - ], - "data": "0x00000000000000000000000000000000000000000000000001848289f538b8000000000000000000000000000000000000000000000000014a5be8bc02a068f90000000000000000000000000000000000000000000005dbd3bbc05dc62a995200000000000000000000000000000000000000000000000148d766320d67b0f90000000000000000000000000000000000000000000005dbd54042e7bb635152", - "logIndex": 118, - "blockHash": "0xf689ba7cfe2c01e2a799b589292f2d463acb200bffdc36ad7364adba7b03d694" - } - ], - "blockNumber": 41756612, - "cumulativeGasUsed": "9713501", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - ], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"AccountCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract EIP1967Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kernelTemplate\",\"outputs\":[{\"internalType\":\"contract Kernel\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KernelFactory.sol\":\"KernelFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n\\nimport \\\"../interfaces/IAccount.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 \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\\n\\n using UserOperationLib for UserOperation;\\n\\n SenderCreator private immutable senderCreator = new SenderCreator();\\n\\n // internal value used during simulation: need to query aggregator.\\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\\n\\n // marker for inner call revert on out of gas\\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\\n\\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\\n\\n /**\\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\\n * in case of signature failure, instead of revert.\\n */\\n uint256 public constant SIG_VALIDATION_FAILED = 1;\\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 op\\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\\n uint256 preGas = gasleft();\\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\\n\\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\\n collected = _actualGasCost;\\n } catch {\\n bytes32 innerRevertCode;\\n assembly {\\n returndatacopy(0, 0, 32)\\n innerRevertCode := mload(0)\\n }\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (innerRevertCode == INNER_OUT_OF_GAS) {\\n //report paymaster, since if it is not deliberately caused by the bundler,\\n // it must be a revert caused by paymaster.\\n revert FailedOp(opIndex, \\\"AA95 out of gas\\\");\\n }\\n\\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\\n }\\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\\n\\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 } //unchecked\\n }\\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\\n\\n uint256 opIndex = 0;\\n for (uint256 a = 0; a < opasLen; a++) {\\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\\n opIndex++;\\n }\\n }\\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\\n\\n UserOpInfo memory opInfo;\\n _simulationOnlyValidations(op);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n\\n numberMarker();\\n uint256 paid = _executeUserOp(0, op, opInfo);\\n numberMarker();\\n bool targetSuccess;\\n bytes memory targetResult;\\n if (target != address(0)) {\\n (targetSuccess, targetResult) = target.call(targetCallData);\\n }\\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\\n }\\n\\n\\n // A memory copy of UserOp static fields only.\\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\\n struct MemoryUserOp {\\n address sender;\\n uint256 nonce;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\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 */\\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\\n uint256 preGas = gasleft();\\n require(msg.sender == address(this), \\\"AA92 internal call only\\\");\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n\\n uint callGasLimit = mUserOp.callGasLimit;\\n unchecked {\\n // handleOps was called with gas limit too low. abort entire bundle.\\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\\n assembly {\\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\\n return _handlePostOp(0, mode, opInfo, context, actualGas);\\n }\\n }\\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 */\\n function getUserOpHash(UserOperation 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 */\\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\\n mUserOp.sender = userOp.sender;\\n mUserOp.nonce = userOp.nonce;\\n mUserOp.callGasLimit = userOp.callGasLimit;\\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\\n mUserOp.preVerificationGas = userOp.preVerificationGas;\\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes calldata paymasterAndData = userOp.paymasterAndData;\\n if (paymasterAndData.length > 0) {\\n require(paymasterAndData.length >= 20, \\\"AA93 invalid paymasterAndData\\\");\\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\\n } else {\\n mUserOp.paymaster = address(0);\\n }\\n }\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external {\\n UserOpInfo memory outOpInfo;\\n\\n _simulationOnlyValidations(userOp);\\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\\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 ? address(bytes20(initCode[0 : 20])) : address(0);\\n factoryInfo = _getStakeInfo(factory);\\n }\\n\\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\\n address aggregator = data.aggregator;\\n bool sigFailed = aggregator == address(1);\\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\\n\\n if (aggregator != address(0) && aggregator != address(1)) {\\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\\n }\\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\\n\\n }\\n\\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\\n unchecked {\\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\\n // our security model might call postOp eventually twice\\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\\n\\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\\n }\\n }\\n\\n // create the sender's contract if needed.\\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) revert FailedOp(opIndex, \\\"AA10 sender already constructed\\\");\\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\\n if (sender1 == address(0)) revert FailedOp(opIndex, \\\"AA13 initCode failed or OOG\\\");\\n if (sender1 != sender) revert FailedOp(opIndex, \\\"AA14 initCode must return sender\\\");\\n if (sender1.code.length == 0) revert FailedOp(opIndex, \\\"AA15 initCode must create sender\\\");\\n address factory = address(bytes20(initCode[0 : 20]));\\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\\n }\\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 calldata initCode) public {\\n address sender = senderCreator.createSender(initCode);\\n revert SenderAddressResult(sender);\\n }\\n\\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\\n // solhint-disable-next-line no-empty-blocks\\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\\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 */\\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\\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 */\\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\\n unchecked {\\n uint256 preGas = gasleft();\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n address sender = mUserOp.sender;\\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\\n address paymaster = mUserOp.paymaster;\\n numberMarker();\\n uint256 missingAccountFunds = 0;\\n if (paymaster == address(0)) {\\n uint256 bal = balanceOf(sender);\\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\\n }\\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\\n returns (uint256 _validationData) {\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA23 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA23 reverted (or OOG)\\\");\\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 = uint112(deposit - requiredPrefund);\\n }\\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\\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 */\\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\\n internal returns (bytes memory context, uint256 validationData) {\\n unchecked {\\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \\\"AA41 too little verificationGas\\\");\\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\\n\\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 = uint112(deposit - requiredPreFund);\\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\\n context = _context;\\n validationData = _validationData;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA33 reverted: \\\", revertReason));\\n } catch {\\n revert FailedOp(opIndex, \\\"AA33 reverted (or OOG)\\\");\\n }\\n }\\n }\\n\\n /**\\n * revert if either account validationData or paymaster validationData is expired\\n */\\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\\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).\\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\\n require(maxGasValues <= type(uint120).max, \\\"AA94 gas values overflow\\\");\\n\\n uint256 gasUsedByValidateAccountPrepayment;\\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\\n\\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\\n revert FailedOp(opIndex, \\\"AA25 invalid account nonce\\\");\\n }\\n\\n //a \\\"marker\\\" where account opcode validation is done and paymaster opcode validation is about to start\\n // (used only by off-chain simulateValidation)\\n numberMarker();\\n\\n bytes memory context;\\n if (mUserOp.paymaster != address(0)) {\\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\\n }\\n unchecked {\\n uint256 gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGasLimit < gasUsed) {\\n revert FailedOp(opIndex, \\\"AA40 over verificationGasLimit\\\");\\n }\\n outOpInfo.prefund = requiredPreFund;\\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\\n }\\n }\\n\\n /**\\n * process post-operation.\\n * 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 opIndex index in the batch\\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\\n } else {\\n // solhint-disable-next-line no-empty-blocks\\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\\n catch Error(string memory reason) {\\n revert FailedOp(opIndex, string.concat(\\\"AA50 postOp reverted: \\\", reason));\\n }\\n catch {\\n revert FailedOp(opIndex, \\\"AA50 postOp revert\\\");\\n }\\n }\\n }\\n }\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n if (opInfo.prefund < actualGasCost) {\\n revert FailedOp(opIndex, \\\"AA51 prefund below actualGasCost\\\");\\n }\\n uint256 refund = opInfo.prefund - actualGasCost;\\n _incrementDeposit(refundAddress, refund);\\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\\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 */\\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\\n assembly {offset := data}\\n }\\n\\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\\n assembly {data := offset}\\n }\\n\\n //place the NUMBER opcode in the code.\\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\\n // account and paymaster.\\n function numberMarker() internal view {\\n assembly {mstore(0, number())}\\n }\\n}\\n\\n\",\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/NonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\n\\n/**\\n * nonce management functionality\\n */\\ncontract 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 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 */\\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\",\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/SenderCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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 /**\\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, followed by calldata\\n * @return sender the returned address of the created account, or zero address on failure.\\n */\\n function createSender(bytes calldata initCode) 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 {\\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\\n sender := mload(0)\\n }\\n if (!success) {\\n sender = address(0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/core/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\nimport \\\"../interfaces/IStakeManager.sol\\\";\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable not-rely-on-time */\\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\\n /// maps paymaster to their deposits and stakes\\n mapping(address => DepositInfo) public deposits;\\n\\n /// @inheritdoc IStakeManager\\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\\n return deposits[account];\\n }\\n\\n // internal method to return just the stake info\\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\\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 function _incrementDeposit(address account, uint256 amount) internal {\\n DepositInfo storage info = deposits[account];\\n uint256 newAmount = info.deposit + amount;\\n require(newAmount <= type(uint112).max, \\\"deposit overflow\\\");\\n info.deposit = uint112(newAmount);\\n }\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) public payable {\\n _incrementDeposit(account, msg.value);\\n DepositInfo storage info = deposits[account];\\n emit Deposited(account, info.deposit);\\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(unstakeDelaySec >= info.unstakeDelaySec, \\\"cannot decrease unstake time\\\");\\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 /**\\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(info.withdrawTime <= block.timestamp, \\\"Stake withdrawal is not due\\\");\\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(address payable withdrawAddress, uint256 withdrawAmount) external {\\n DepositInfo storage info = deposits[msg.sender];\\n require(withdrawAmount <= info.deposit, \\\"Withdraw amount too large\\\");\\n info.deposit = uint112(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\",\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.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\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\\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\\n * zero length to signify postOp is not required.\\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n * Now this is the 2nd call, after user's op was deliberately reverted.\\n * @param context - the context value returned by validatePaymasterUserOp\\n * @param actualGasCost - actual gas used so far (without this postOp call).\\n */\\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\\n}\\n\",\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\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 {\\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 {\\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 {\\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 {\\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 {\\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\",\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\"},\"lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\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 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 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 require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\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\",\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/Kernel.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"./plugin/IPlugin.sol\\\";\\nimport \\\"account-abstraction/core/Helpers.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport {EntryPoint} from \\\"account-abstraction/core/EntryPoint.sol\\\";\\nimport \\\"./utils/Exec.sol\\\";\\nimport \\\"./abstract/Compatibility.sol\\\";\\nimport \\\"./abstract/KernelStorage.sol\\\";\\n\\n/// @title Kernel\\n/// @author taek\\n/// @notice wallet kernel for minimal wallet functionality\\n/// @dev supports only 1 owner, multiple plugins\\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\\n error InvalidNonce();\\n error InvalidSignatureLength();\\n error QueryResult(bytes result);\\n\\n string public constant name = \\\"Kernel\\\";\\n\\n string public constant version = \\\"0.0.1\\\";\\n\\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\\n\\n /// @notice initialize wallet kernel\\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\\n /// @param _owner owner address\\n function initialize(address _owner) external {\\n WalletKernelStorage storage ws = getKernelStorage();\\n require(ws.owner == address(0), \\\"account: already initialized\\\");\\n ws.owner = _owner;\\n }\\n\\n /// @notice Query plugin for data\\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\\n /// @param _plugin Plugin address\\n /// @param _data Data to query\\n function queryPlugin(address _plugin, bytes calldata _data) external {\\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\\n if (success) {\\n revert QueryResult(_ret);\\n } else {\\n assembly {\\n revert(add(_ret, 32), mload(_ret))\\n }\\n }\\n }\\n\\n /// @notice execute function call to external contract\\n /// @dev this function will execute function call to external contract\\n /// @param to target contract address\\n /// @param value value to be sent\\n /// @param data data to be sent\\n /// @param operation operation type (call or delegatecall)\\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\\n \\\"account: not from entrypoint or owner\\\"\\n );\\n bool success;\\n bytes memory ret;\\n if (operation == Operation.DelegateCall) {\\n (success, ret) = Exec.delegateCall(to, data);\\n } else {\\n (success, ret) = Exec.call(to, value, data);\\n }\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n }\\n\\n /// @notice validate user operation\\n /// @dev this function will validate user operation and be called by EntryPoint\\n /// @param userOp user operation\\n /// @param userOpHash user operation hash\\n /// @param missingAccountFunds funds needed to be reimbursed\\n /// @return validationData validation data\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (uint256 validationData)\\n {\\n require(msg.sender == address(entryPoint), \\\"account: not from entryPoint\\\");\\n if (userOp.signature.length == 65) {\\n validationData = _validateUserOp(userOp, userOpHash);\\n } else if (userOp.signature.length > 97) {\\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\\n address plugin = address(bytes20(userOp.signature[0:20]));\\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\\n bytes memory signature = userOp.signature[32:97];\\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\n \\\"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\\\"\\n ), // we are going to trust plugin for verification\\n plugin,\\n validUntil,\\n validAfter,\\n keccak256(data)\\n )\\n )\\n );\\n\\n address signer = ECDSA.recover(digest, signature);\\n if (getKernelStorage().owner != signer) {\\n return SIG_VALIDATION_FAILED;\\n }\\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\\n bool res = abi.decode(ret, (bool));\\n if (!res) {\\n return SIG_VALIDATION_FAILED;\\n }\\n validationData = _packValidationData(!res, validUntil, validAfter);\\n } else {\\n revert InvalidSignatureLength();\\n }\\n if (missingAccountFunds > 0) {\\n // we are going to assume signature is valid at this point\\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\\\"\\\");\\n (success);\\n return validationData;\\n }\\n }\\n\\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\\n internal\\n view\\n returns (uint256 validationData)\\n {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\\n return validationData;\\n }\\n\\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\\n address recovered = ECDSA.recover(hash, userOp.signature);\\n if (ws.owner != recovered) {\\n return SIG_VALIDATION_FAILED;\\n }\\n }\\n\\n /**\\n * delegate the contract call to the plugin\\n */\\n function _delegateToPlugin(\\n address plugin,\\n UserOperation calldata userOp,\\n bytes32 opHash,\\n uint256 missingAccountFunds\\n ) internal returns (bytes memory) {\\n bytes memory data =\\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\\n if (!success) {\\n assembly {\\n revert(add(ret, 32), mload(ret))\\n }\\n }\\n return ret;\\n }\\n\\n /// @notice validate signature using eip1271\\n /// @dev this function will validate signature using eip1271\\n /// @param _hash hash to be signed\\n /// @param _signature signature\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\\n WalletKernelStorage storage ws = getKernelStorage();\\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\\n return 0x1626ba7e;\\n }\\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\\n address recovered = ECDSA.recover(hash, _signature);\\n // Validate signatures\\n if (ws.owner == recovered) {\\n return 0x1626ba7e;\\n } else {\\n return 0xffffffff;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xee1651f7212298696da5a773709d0a33ee272ae8c06e31824655e71a2228ae25\",\"license\":\"MIT\"},\"src/KernelFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\nimport \\\"./factory/EIP1967Proxy.sol\\\";\\nimport \\\"./Kernel.sol\\\";\\n\\ncontract KernelFactory {\\n Kernel public immutable kernelTemplate;\\n\\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\\n\\n constructor(IEntryPoint _entryPoint) {\\n kernelTemplate = new Kernel(_entryPoint);\\n }\\n\\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n address addr = Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n if (addr.code.length > 0) {\\n return EIP1967Proxy(payable(addr));\\n }\\n proxy =\\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\\n emit AccountCreated(address(proxy), _owner, _index);\\n }\\n\\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\\n return Create2.computeAddress(\\n salt,\\n keccak256(\\n abi.encodePacked(\\n type(EIP1967Proxy).creationCode,\\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x53a5dbafaf7d000de850be785d4c2d883980acf1772d231b510c122640ccf789\",\"license\":\"MIT\"},\"src/abstract/Compatibility.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Compatibility {\\n receive() external payable {}\\n\\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\\n external\\n pure\\n returns (bytes4)\\n {\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\\n}\\n\",\"keccak256\":\"0x0d4634886db9ce6c2321db3a9bbbe0883cffe654cbce75dcfc9df1ec7eedb0b8\",\"license\":\"MIT\"},\"src/abstract/KernelStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\n\\nstruct WalletKernelStorage {\\n address owner;\\n}\\n\\ncontract KernelStorage {\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n IEntryPoint public immutable entryPoint;\\n\\n event Upgraded(address indexed newImplementation);\\n\\n // modifier for checking if the sender is the entrypoint or\\n // the account itself\\n modifier onlyFromEntryPointOrOwnerOrSelf() {\\n require(\\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\\n \\\"account: not from entrypoint or owner or self\\\"\\n );\\n _;\\n }\\n\\n constructor(IEntryPoint _entryPoint) {\\n entryPoint = _entryPoint;\\n getKernelStorage().owner = address(1);\\n }\\n /// @notice get wallet kernel storage\\n /// @dev used to get wallet kernel storage\\n /// @return ws wallet kernel storage, consists of owner and nonces\\n\\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\\n bytes32 storagePosition = bytes32(uint256(keccak256(\\\"zerodev.kernel\\\")) - 1);\\n assembly {\\n ws.slot := storagePosition\\n }\\n }\\n\\n function getOwner() external view returns (address) {\\n return getKernelStorage().owner;\\n }\\n\\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n assembly {\\n sstore(slot, _newImplementation)\\n }\\n emit Upgraded(_newImplementation);\\n }\\n\\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\\n getKernelStorage().owner = _newOwner;\\n }\\n\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), 0);\\n }\\n\\n function getNonce(uint192 key) public view virtual returns (uint256) {\\n return entryPoint.getNonce(address(this), key);\\n }\\n}\\n \",\"keccak256\":\"0xe4512794b67794cf90eba665aee57b75efa60f2aacd1cc45eb17d3f3b255008c\",\"license\":\"MIT\"},\"src/factory/EIP1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract EIP1967Proxy {\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n constructor(address _logic, bytes memory _data) payable {\\n require(_logic != address(0), \\\"EIP1967Proxy: implementation is the zero address\\\");\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n sstore(slot, _logic)\\n }\\n if (_data.length > 0) {\\n (bool success,) = _logic.delegatecall(_data);\\n require(success, \\\"EIP1967Proxy: constructor call failed\\\");\\n }\\n }\\n\\n fallback() external payable {\\n address implementation = _implementation();\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 { revert(0, returndatasize()) }\\n default { return(0, returndatasize()) }\\n }\\n }\\n\\n function _implementation() internal view returns (address impl) {\\n bytes32 slot = _IMPLEMENTATION_SLOT;\\n assembly {\\n impl := sload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbec8942c8258db6379a08dcb3b0a4aa0ee585972f26eba258c35ece87972d78b\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/utils/Exec.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.5 <0.9.0;\\n\\n// solhint-disable no-inline-assembly\\n\\nenum Operation {\\n Call,\\n DelegateCall\\n}\\n\\n/**\\n * Utility functions helpful when making different kinds of contract calls in Solidity.\\n */\\nlibrary Exec {\\n function call(address to, uint256 value, bytes memory data)\\n internal\\n returns (bool success, bytes memory returnData)\\n {\\n assembly {\\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\\n assembly {\\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\\n assembly {\\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\\n let len := returndatasize()\\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\",\"keccak256\":\"0x1eef311d5073ff7f02b44311ae4d5c53f619ea19f1a059b8d17c028d141c2893\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b506040516200466d3803806200466d833981810160405281019062000037919062000136565b806040516200004690620000aa565b620000529190620001d3565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050620001f0565b613527806200114683390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ea82620000bd565b9050919050565b6000620000fe82620000dd565b9050919050565b6200011081620000f1565b81146200011c57600080fd5b50565b600081519050620001308162000105565b92915050565b6000602082840312156200014f576200014e620000b8565b5b60006200015f848285016200011f565b91505092915050565b6000819050919050565b6000620001936200018d6200018784620000bd565b62000168565b620000bd565b9050919050565b6000620001a78262000172565b9050919050565b6000620001bb826200019a565b9050919050565b620001cd81620001ae565b82525050565b6000602082019050620001ea6000830184620001c2565b92915050565b608051610f26620002206000396000818160db0152818161015a0152818161028a01526103830152610f266000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c634300081200336101606040523480156200001257600080fd5b5060405162003527380380620035278339818101604052810190620000389190620002e2565b806040518060400160405280600681526020017f4b65726e656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200010e818484620001e760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505060016200019e6200022360201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000422565b60008383834630604051602001620002049594939291906200035b565b6040516020818303038152906040528051906020012090509392505050565b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c620002589190620003e7565b60001b90508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002968262000269565b9050919050565b6000620002aa8262000289565b9050919050565b620002bc816200029d565b8114620002c857600080fd5b50565b600081519050620002dc81620002b1565b92915050565b600060208284031215620002fb57620002fa62000264565b5b60006200030b84828501620002cb565b91505092915050565b6000819050919050565b620003298162000314565b82525050565b6000819050919050565b62000344816200032f565b82525050565b620003558162000289565b82525050565b600060a0820190506200037260008301886200031e565b6200038160208301876200031e565b6200039060408301866200031e565b6200039f606083018562000339565b620003ae60808301846200034a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003f4826200032f565b915062000401836200032f565b92508282039050818111156200041c576200041b620003b8565b5b92915050565b60805160a05160c05160e051610100516101205161014051613080620004a76000396000818161057a0152818161071301528181610b1501528181610c2401528181610e0b01528181610f2f0152610fe701526000611800015260006118420152600061182101526000611756015260006117ac015260006117d501526130806000f3fe6080604052600436106100f75760003560e01c8063940d3c601161008a578063d087d28811610059578063d087d2881461035b578063f23a6e6114610386578063f2fde38b146103c3578063f333df55146103ec576100fe565b8063940d3c60146102a1578063b0d691fe146102ca578063bc197c81146102f5578063c4d66de814610332576100fe565b80633a871cdd116100c65780633a871cdd146101d15780633e1b08121461020e57806354fd4d501461024b578063893d20e814610276576100fe565b806306fdde0314610103578063150b7a021461012e5780631626ba7e1461016b5780633659cfe6146101a8576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b50610118610415565b6040516101259190611a4b565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611b7a565b61044e565b6040516101629190611c3d565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190611dbe565b610463565b60405161019f9190611c3d565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca9190611e1a565b610578565b005b3480156101dd57600080fd5b506101f860048036038101906101f39190611e6c565b61070f565b6040516102059190611eea565b60405180910390f35b34801561021a57600080fd5b5061023560048036038101906102309190611f55565b610b11565b6040516102429190611eea565b60405180910390f35b34801561025757600080fd5b50610260610bb6565b60405161026d9190611a4b565b60405180910390f35b34801561028257600080fd5b5061028b610bef565b6040516102989190611f91565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190611fd1565b610c22565b005b3480156102d657600080fd5b506102df610e09565b6040516102ec91906120b8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612129565b610e2d565b6040516103299190611c3d565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190611e1a565b610e45565b005b34801561036757600080fd5b50610370610f2b565b60405161037d9190611eea565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612205565b610fcf565b6040516103ba9190611c3d565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190611e1a565b610fe5565b005b3480156103f857600080fd5b50610413600480360381019061040e919061229f565b611157565b005b6040518060400160405280600681526020017f4b65726e656c000000000000000000000000000000000000000000000000000081525081565b600063150b7a0260e01b905095945050505050565b60008061046e6111f7565b905061047a8484611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036104e057631626ba7e60e01b915050610572565b60006104eb8561125d565b905060006104f98286611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361056457631626ba7e60e01b9350505050610572565b63ffffffff60e01b93505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061062857506105d56111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061065e57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069490612371565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610796906123dd565b60405180910390fd5b6041848061014001906107b2919061240c565b9050036107ca576107c3848461128d565b9050610a8e565b6061848061014001906107dd919061240c565b90501115610a5b576000848061014001906107f8919061240c565b60009060149261080a93929190612479565b9061081591906124f8565b60601c905060008580610140019061082d919061240c565b601490601a9261083f93929190612479565b9061084a9190612583565b60d01c9050600086806101400190610862919061240c565b601a9060209261087493929190612479565b9061087f9190612583565b60d01c9050600087806101400190610897919061240c565b6020906061926108a993929190612479565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600088806101400190610901919061240c565b606190809261091293929190612479565b81019061091f91906125e2565b50905060006109827f4584533bad8bbd8aa77024a548a56acb8d2807847381ce1b3364745ca396b2e3878787868051906020012060405160200161096795949392919061268a565b6040516020818303038152906040528051906020012061142e565b905060006109908285611236565b90508073ffffffffffffffffffffffffffffffffffffffff166109b16111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a00576001975050505050505050610b0a565b6000610a0e888d8d8d611448565b9050600081806020019051810190610a269190612715565b905080610a3f5760019950505050505050505050610b0a565b610a4b811589896114f4565b9950505050505050505050610a8d565b6040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6000821115610b095760003373ffffffffffffffffffffffffffffffffffffffff1683604051610abd90612773565b60006040518083038185875af1925050503d8060008114610afa576040519150601f19603f3d011682016040523d82523d6000602084013e610aff565b606091505b5050905050610b0a565b5b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a30846040518363ffffffff1660e01b8152600401610b6e929190612797565b602060405180830381865afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf91906127d5565b9050919050565b6040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525081565b6000610bf96111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c7f6111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612874565b60405180910390fd5b60006060600180811115610d2857610d27612894565b5b836001811115610d3b57610d3a612894565b5b03610d9b57610d8e8786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b8092508193505050610df3565b610dea878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611563565b80925081935050505b81610e0057805160208201fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905098975050505050505050565b6000610e4f6111f7565b9050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb9061290f565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b8152600401610f8992919061296a565b602060405180830381865afa158015610fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fca91906127d5565b905090565b600063f23a6e6160e01b90509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061109557506110426111f7565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110cb57503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612371565b60405180910390fd5b806111136111f7565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111a88585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061152d565b9150915081156111ef57806040517fa52b21690000000000000000000000000000000000000000000000000000000081526004016111e691906129e8565b60405180910390fd5b805160208201fd5b60008060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd960001c61122a9190612a39565b60001b90508091505090565b6000806000611245858561159b565b91509150611252816115ec565b819250505092915050565b6000816040516020016112709190612ae5565b604051602081830303815290604052805190602001209050919050565b6000806112986111f7565b90506112f783858061014001906112af919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113535750611428565b600061135e8461125d565b905060006113bf8287806101400190611377919061240c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611236565b90508073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114245760019350505050611428565b5050505b92915050565b600061144161143b611752565b8361186c565b9050919050565b60606000639e2045ce60e01b85858560405160240161146993929190612d6b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000806114d5888461152d565b91509150816114e657805160208201fd5b809350505050949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561151c57600061151f565b60015b60ff16171790509392505050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60008060418351036115dc5760008060006020860151925060408601519150606086015160001a90506115d08782858561189f565b945094505050506115e5565b60006002915091505b9250929050565b60006004811115611600576115ff612894565b5b81600481111561161357611612612894565b5b031561174f576001600481111561162d5761162c612894565b5b8160048111156116405761163f612894565b5b03611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612df5565b60405180910390fd5b6002600481111561169457611693612894565b5b8160048111156116a7576116a6612894565b5b036116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90612e61565b60405180910390fd5b600360048111156116fb576116fa612894565b5b81600481111561170e5761170d612894565b5b0361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590612ef3565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117ce57507f000000000000000000000000000000000000000000000000000000000000000046145b156117fb577f00000000000000000000000000000000000000000000000000000000000000009050611869565b6118667f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611981565b90505b90565b60008282604051602001611881929190612f5f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118da576000600391509150611978565b6000600187878787604051600081526020016040526040516118ff9493929190612fb2565b6020604051602081039080840390855afa158015611921573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196f57600060019250925050611978565b80600092509250505b94509492505050565b6000838383463060405160200161199c959493929190612ff7565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119f55780820151818401526020810190506119da565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a1d826119bb565b611a2781856119c6565b9350611a378185602086016119d7565b611a4081611a01565b840191505092915050565b60006020820190508181036000830152611a658184611a12565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611aac82611a81565b9050919050565b611abc81611aa1565b8114611ac757600080fd5b50565b600081359050611ad981611ab3565b92915050565b6000819050919050565b611af281611adf565b8114611afd57600080fd5b50565b600081359050611b0f81611ae9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b3a57611b39611b15565b5b8235905067ffffffffffffffff811115611b5757611b56611b1a565b5b602083019150836001820283011115611b7357611b72611b1f565b5b9250929050565b600080600080600060808688031215611b9657611b95611a77565b5b6000611ba488828901611aca565b9550506020611bb588828901611aca565b9450506040611bc688828901611b00565b935050606086013567ffffffffffffffff811115611be757611be6611a7c565b5b611bf388828901611b24565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c3781611c02565b82525050565b6000602082019050611c526000830184611c2e565b92915050565b6000819050919050565b611c6b81611c58565b8114611c7657600080fd5b50565b600081359050611c8881611c62565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ccb82611a01565b810181811067ffffffffffffffff82111715611cea57611ce9611c93565b5b80604052505050565b6000611cfd611a6d565b9050611d098282611cc2565b919050565b600067ffffffffffffffff821115611d2957611d28611c93565b5b611d3282611a01565b9050602081019050919050565b82818337600083830152505050565b6000611d61611d5c84611d0e565b611cf3565b905082815260208101848484011115611d7d57611d7c611c8e565b5b611d88848285611d3f565b509392505050565b600082601f830112611da557611da4611b15565b5b8135611db5848260208601611d4e565b91505092915050565b60008060408385031215611dd557611dd4611a77565b5b6000611de385828601611c79565b925050602083013567ffffffffffffffff811115611e0457611e03611a7c565b5b611e1085828601611d90565b9150509250929050565b600060208284031215611e3057611e2f611a77565b5b6000611e3e84828501611aca565b91505092915050565b600080fd5b60006101608284031215611e6357611e62611e47565b5b81905092915050565b600080600060608486031215611e8557611e84611a77565b5b600084013567ffffffffffffffff811115611ea357611ea2611a7c565b5b611eaf86828701611e4c565b9350506020611ec086828701611c79565b9250506040611ed186828701611b00565b9150509250925092565b611ee481611adf565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b611f3281611f05565b8114611f3d57600080fd5b50565b600081359050611f4f81611f29565b92915050565b600060208284031215611f6b57611f6a611a77565b5b6000611f7984828501611f40565b91505092915050565b611f8b81611aa1565b82525050565b6000602082019050611fa66000830184611f82565b92915050565b60028110611fb957600080fd5b50565b600081359050611fcb81611fac565b92915050565b600080600080600060808688031215611fed57611fec611a77565b5b6000611ffb88828901611aca565b955050602061200c88828901611b00565b945050604086013567ffffffffffffffff81111561202d5761202c611a7c565b5b61203988828901611b24565b9350935050606061204c88828901611fbc565b9150509295509295909350565b6000819050919050565b600061207e61207961207484611a81565b612059565b611a81565b9050919050565b600061209082612063565b9050919050565b60006120a282612085565b9050919050565b6120b281612097565b82525050565b60006020820190506120cd60008301846120a9565b92915050565b60008083601f8401126120e9576120e8611b15565b5b8235905067ffffffffffffffff81111561210657612105611b1a565b5b60208301915083602082028301111561212257612121611b1f565b5b9250929050565b60008060008060008060008060a0898b03121561214957612148611a77565b5b60006121578b828c01611aca565b98505060206121688b828c01611aca565b975050604089013567ffffffffffffffff81111561218957612188611a7c565b5b6121958b828c016120d3565b9650965050606089013567ffffffffffffffff8111156121b8576121b7611a7c565b5b6121c48b828c016120d3565b9450945050608089013567ffffffffffffffff8111156121e7576121e6611a7c565b5b6121f38b828c01611b24565b92509250509295985092959890939650565b60008060008060008060a0878903121561222257612221611a77565b5b600061223089828a01611aca565b965050602061224189828a01611aca565b955050604061225289828a01611b00565b945050606061226389828a01611b00565b935050608087013567ffffffffffffffff81111561228457612283611a7c565b5b61229089828a01611b24565b92509250509295509295509295565b6000806000604084860312156122b8576122b7611a77565b5b60006122c686828701611aca565b935050602084013567ffffffffffffffff8111156122e7576122e6611a7c565b5b6122f386828701611b24565b92509250509250925092565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572206f722073656c6600000000000000000000000000000000000000602082015250565b600061235b602d836119c6565b9150612366826122ff565b604082019050919050565b6000602082019050818103600083015261238a8161234e565b9050919050565b7f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000600082015250565b60006123c7601c836119c6565b91506123d282612391565b602082019050919050565b600060208201905081810360008301526123f6816123ba565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612429576124286123fd565b5b80840192508235915067ffffffffffffffff82111561244b5761244a612402565b5b60208301925060018202360383131561246757612466612407565b5b509250929050565b600080fd5b600080fd5b6000808585111561248d5761248c61246f565b5b8386111561249e5761249d612474565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b600061250483836124b4565b8261250f81356124bf565b9250601482101561254f5761254a7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026124eb565b831692505b505092915050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b600061258f83836124b4565b8261259a8135612557565b925060068210156125da576125d57fffffffffffff0000000000000000000000000000000000000000000000000000836006036008026124eb565b831692505b505092915050565b600080604083850312156125f9576125f8611a77565b5b600083013567ffffffffffffffff81111561261757612616611a7c565b5b61262385828601611d90565b925050602083013567ffffffffffffffff81111561264457612643611a7c565b5b61265085828601611d90565b9150509250929050565b61266381611c58565b82525050565b600065ffffffffffff82169050919050565b61268481612669565b82525050565b600060a08201905061269f600083018861265a565b6126ac6020830187611f82565b6126b9604083018661267b565b6126c6606083018561267b565b6126d3608083018461265a565b9695505050505050565b60008115159050919050565b6126f2816126dd565b81146126fd57600080fd5b50565b60008151905061270f816126e9565b92915050565b60006020828403121561272b5761272a611a77565b5b600061273984828501612700565b91505092915050565b600081905092915050565b50565b600061275d600083612742565b91506127688261274d565b600082019050919050565b600061277e82612750565b9150819050919050565b61279181611f05565b82525050565b60006040820190506127ac6000830185611f82565b6127b96020830184612788565b9392505050565b6000815190506127cf81611ae9565b92915050565b6000602082840312156127eb576127ea611a77565b5b60006127f9848285016127c0565b91505092915050565b7f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061285e6025836119c6565b915061286982612802565b604082019050919050565b6000602082019050818103600083015261288d81612851565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6163636f756e743a20616c726561647920696e697469616c697a656400000000600082015250565b60006128f9601c836119c6565b9150612904826128c3565b602082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b6000819050919050565b600061295461294f61294a8461292f565b612059565b611f05565b9050919050565b61296481612939565b82525050565b600060408201905061297f6000830185611f82565b61298c602083018461295b565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006129ba82612993565b6129c4818561299e565b93506129d48185602086016119d7565b6129dd81611a01565b840191505092915050565b60006020820190508181036000830152612a0281846129af565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4482611adf565b9150612a4f83611adf565b9250828203905081811115612a6757612a66612a0a565b5b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612aae601c83612a6d565b9150612ab982612a78565b601c82019050919050565b6000819050919050565b612adf612ada82611c58565b612ac4565b82525050565b6000612af082612aa1565b9150612afc8284612ace565b60208201915081905092915050565b6000612b1a6020840184611aca565b905092915050565b612b2b81611aa1565b82525050565b6000612b406020840184611b00565b905092915050565b612b5181611adf565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612b8357612b82612b61565b5b83810192508235915060208301925067ffffffffffffffff821115612bab57612baa612b57565b5b600182023603831315612bc157612bc0612b5c565b5b509250929050565b600082825260208201905092915050565b6000612be68385612bc9565b9350612bf3838584611d3f565b612bfc83611a01565b840190509392505050565b60006101608301612c1b6000840184612b0b565b612c286000860182612b22565b50612c366020840184612b31565b612c436020860182612b48565b50612c516040840184612b66565b8583036040870152612c64838284612bda565b92505050612c756060840184612b66565b8583036060870152612c88838284612bda565b92505050612c996080840184612b31565b612ca66080860182612b48565b50612cb460a0840184612b31565b612cc160a0860182612b48565b50612ccf60c0840184612b31565b612cdc60c0860182612b48565b50612cea60e0840184612b31565b612cf760e0860182612b48565b50612d06610100840184612b31565b612d14610100860182612b48565b50612d23610120840184612b66565b858303610120870152612d37838284612bda565b92505050612d49610140840184612b66565b858303610140870152612d5d838284612bda565b925050508091505092915050565b60006060820190508181036000830152612d858186612c07565b9050612d94602083018561265a565b612da16040830184611edb565b949350505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612ddf6018836119c6565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612e4b601f836119c6565b9150612e5682612e15565b602082019050919050565b60006020820190508181036000830152612e7a81612e3e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612edd6022836119c6565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f49600283612a6d565b9150612f5482612f13565b600282019050919050565b6000612f6a82612f3c565b9150612f768285612ace565b602082019150612f868284612ace565b6020820191508190509392505050565b600060ff82169050919050565b612fac81612f96565b82525050565b6000608082019050612fc7600083018761265a565b612fd46020830186612fa3565b612fe1604083018561265a565b612fee606083018461265a565b95945050505050565b600060a08201905061300c600083018861265a565b613019602083018761265a565b613026604083018661265a565b6130336060830185611edb565b6130406080830184611f82565b969550505050505056fea264697066735822122032ca1cf88a7b31318141bd230c1cabd5f99c4503ed694966da441ea9decb738c64736f6c63430008120033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000465760003560e01c8063037637aa146200004b5780630d253d76146200006d5780635fbfb9cf14620000a3575b600080fd5b62000055620000d9565b604051620000649190620005a4565b60405180910390f35b6200008b600480360381019062000085919062000646565b620000fd565b6040516200009a91906200069e565b60405180910390f35b620000c16004803603810190620000bb919062000646565b6200022b565b604051620000d09190620006e0565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083836040516020016200011592919062000772565b60405160208183030381529060405280519060200120905062000222816040518060200162000144906200050b565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000876040516024016200018c91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620001e49291906200083c565b60405160208183030381529060405260405160200162000206929190620008b2565b60405160208183030381529060405280519060200120620004c9565b91505092915050565b60008083836040516020016200024392919062000772565b604051602081830303815290604052805190602001209050600062000352826040518060200162000274906200050b565b6020820181038252601f19601f820116604052507f000000000000000000000000000000000000000000000000000000000000000088604051602401620002bc91906200069e565b60405160208183030381529060405263c4d66de860e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051602001620003149291906200083c565b60405160208183030381529060405260405160200162000336929190620008b2565b60405160208183030381529060405280519060200120620004c9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111562000380578092505050620004c3565b817f000000000000000000000000000000000000000000000000000000000000000063c4d66de860e01b87604051602401620003bd91906200069e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000428906200050b565b620004359291906200083c565b8190604051809103906000f590508015801562000456573d6000803e3d6000fd5b5092508473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff86604051620004b89190620008eb565b60405180910390a350505b92915050565b6000620004d8838330620004e0565b905092915050565b6000604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b6105e8806200090983390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620005646200055e620005588462000519565b62000539565b62000519565b9050919050565b6000620005788262000543565b9050919050565b60006200058c826200056b565b9050919050565b6200059e816200057f565b82525050565b6000602082019050620005bb600083018462000593565b92915050565b600080fd5b6000620005d38262000519565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000813590506200060581620005da565b92915050565b6000819050919050565b62000620816200060b565b81146200062c57600080fd5b50565b600081359050620006408162000615565b92915050565b6000806040838503121562000660576200065f620005c1565b5b60006200067085828601620005f4565b925050602062000683858286016200062f565b9150509250929050565b6200069881620005c6565b82525050565b6000602082019050620006b560008301846200068d565b92915050565b6000620006c8826200056b565b9050919050565b620006da81620006bb565b82525050565b6000602082019050620006f76000830184620006cf565b92915050565b60008160601b9050919050565b60006200071782620006fd565b9050919050565b60006200072b826200070a565b9050919050565b620007476200074182620005c6565b6200071e565b82525050565b6000819050919050565b6200076c62000766826200060b565b6200074d565b82525050565b600062000780828562000732565b60148201915062000792828462000757565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620007de578082015181840152602081019050620007c1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200080882620007a2565b620008148185620007ad565b935062000826818560208601620007be565b6200083181620007ea565b840191505092915050565b60006040820190506200085360008301856200068d565b8181036020830152620008678184620007fb565b90509392505050565b600081905092915050565b60006200088882620007a2565b62000894818562000870565b9350620008a6818560208601620007be565b80840191505092915050565b6000620008c082856200087b565b9150620008ce82846200087b565b91508190509392505050565b620008e5816200060b565b82525050565b6000602082019050620009026000830184620008da565b9291505056fe60806040526040516105e83803806105e883398181016040528101906100259190610351565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008b90610430565b60405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508281556000825111156101765760008373ffffffffffffffffffffffffffffffffffffffff16836040516100f09190610497565b600060405180830381855af49150503d806000811461012b576040519150601f19603f3d011682016040523d82523d6000602084013e610130565b606091505b5050905080610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610520565b60405180910390fd5b505b505050610540565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bd82610192565b9050919050565b6101cd816101b2565b81146101d857600080fd5b50565b6000815190506101ea816101c4565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610243826101fa565b810181811067ffffffffffffffff821117156102625761026161020b565b5b80604052505050565b600061027561017e565b9050610281828261023a565b919050565b600067ffffffffffffffff8211156102a1576102a061020b565b5b6102aa826101fa565b9050602081019050919050565b60005b838110156102d55780820151818401526020810190506102ba565b60008484015250505050565b60006102f46102ef84610286565b61026b565b9050828152602081018484840111156103105761030f6101f5565b5b61031b8482856102b7565b509392505050565b600082601f830112610338576103376101f0565b5b81516103488482602086016102e1565b91505092915050565b6000806040838503121561036857610367610188565b5b6000610376858286016101db565b925050602083015167ffffffffffffffff8111156103975761039661018d565b5b6103a385828601610323565b9150509250929050565b600082825260208201905092915050565b7f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060008201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b600061041a6030836103ad565b9150610425826103be565b604082019050919050565b600060208201905081810360008301526104498161040d565b9050919050565b600081519050919050565b600081905092915050565b600061047182610450565b61047b818561045b565b935061048b8185602086016102b7565b80840191505092915050565b60006104a38284610466565b915081905092915050565b7f4549503139363750726f78793a20636f6e7374727563746f722063616c6c206660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b600061050a6025836103ad565b9150610515826104ae565b604082019050919050565b60006020820190508181036000830152610539816104fd565b9050919050565b609a8061054e6000396000f3fe60806040526000600c6033565b90503660008037600080366000845af43d6000803e8060008114602e573d6000f35b3d6000fd5b6000807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150509056fea2646970667358221220388bcbb27d5b065c1b785d1b94666d7f301b338574b92c716035a8fc03df3d4064736f6c63430008120033a2646970667358221220f50046c0d563594938691fabbaecaf185ed1de2d60d093c2816cf6a34a40c32a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/polygon/ZeroDevSessionKeyPlugin.json b/deployments/polygon/ZeroDevSessionKeyPlugin.json deleted file mode 100644 index aa845146..00000000 --- a/deployments/polygon/ZeroDevSessionKeyPlugin.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "address": "0x6E2631aF80bF7a9cEE83F590eE496bCc2E40626D", - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "key", - "type": "address" - } - ], - "name": "SessionKeyRevoked", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_packed", - "type": "bytes" - } - ], - "name": "parseDataAndSignature", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revokeSessionKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_key", - "type": "address" - } - ], - "name": "revoked", - "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": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validatePluginData", - "outputs": [ - { - "internalType": "bool", - "name": "validated", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x47c6c345ed279550cff6a4f9d03c828a2a91d687fe3efa4a30a4cf959bb74a6d", - "receipt": { - "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "from": "0x8d8a9Cf53b7D95C148cB159384D249F8FB68db3f", - "contractAddress": null, - "transactionIndex": 20, - "gasUsed": "1716069", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000008000000000000000000000000000000000000000000020000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000008000004000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000041000000000000000000000000000000100000000000000000000000000000000000000000000800000000000000000000000000100000", - "blockHash": "0xcdaf96edb2f94217be6eaa18c699362dd1ffcd7bf5eb1727ba5f78259785d6d4", - "transactionHash": "0x47c6c345ed279550cff6a4f9d03c828a2a91d687fe3efa4a30a4cf959bb74a6d", - "logs": [ - { - "transactionIndex": 20, - "blockNumber": 41756616, - "transactionHash": "0x47c6c345ed279550cff6a4f9d03c828a2a91d687fe3efa4a30a4cf959bb74a6d", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x0000000000000000000000008d8a9cf53b7d95c148cb159384d249f8fb68db3f", - "0x000000000000000000000000b2dd091ea6e591d62f565d7a18ce2a7640add227" - ], - "data": "0x00000000000000000000000000000000000000000000000000b6e6ab7ea6dc000000000000000000000000000000000000000000000000013a3e29fc746cb7790000000000000000000000000000000000000000000005dc18ef5d92af3c9cdb00000000000000000000000000000000000000000000000139874350f5c5db790000000000000000000000000000000000000000000005dc19a6443e2de378db", - "logIndex": 211, - "blockHash": "0xcdaf96edb2f94217be6eaa18c699362dd1ffcd7bf5eb1727ba5f78259785d6d4" - } - ], - "blockNumber": 41756616, - "cumulativeGasUsed": "26223434", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "d5c4a417af7f759d03a3c7da438dc2be", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"key\",\"type\":\"address\"}],\"name\":\"SessionKeyRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_packed\",\"type\":\"bytes\"}],\"name\":\"parseDataAndSignature\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revokeSessionKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_key\",\"type\":\"address\"}],\"name\":\"revoked\",\"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\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validatePluginData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/plugin/ZeroDevSessionKeyPlugin.sol\":\"ZeroDevSessionKeyPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\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 */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\\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\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\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 able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"lib/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.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\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, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\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 */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\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\\n * The string starts with a unique code \\\"AAmn\\\", 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 * 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 */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\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 */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\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 sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\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\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (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, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\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\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\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(\\n address indexed account,\\n uint256 withdrawTime\\n );\\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,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\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 uint112 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 /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\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(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\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 callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd466e8b07f4c6220eac16da5127f3ff142e65f0c15c03c7d38f257b02c8585e1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"src/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"account-abstraction/interfaces/UserOperation.sol\\\";\\n\\ninterface IPlugin {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xe560c14d4055e404a78ea0984006255a5b4d6acf29859de2f690520abf06a6a2\",\"license\":\"MIT\"},\"src/plugin/ZeroDevBasePlugin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\\\";\\nimport \\\"account-abstraction/interfaces/IAccount.sol\\\";\\nimport \\\"account-abstraction/interfaces/IEntryPoint.sol\\\";\\nimport \\\"./IPlugin.sol\\\";\\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external\\n override\\n returns (bool validated)\\n {\\n // data offset starts at 97\\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\\n validated = _validatePluginData(userOp, userOpHash, data, signature);\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal virtual returns (bool success);\\n\\n function parseDataAndSignature(bytes calldata _packed)\\n public\\n pure\\n returns (bytes calldata data, bytes calldata signature)\\n {\\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\\n\\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \\\"invalid data\\\");\\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \\\"invalid signature\\\");\\n }\\n}\\n\",\"keccak256\":\"0x600b768ba7d0766b2968c0d9bd6cd21154f14694eeb1e1a745d110d0fcb854e8\",\"license\":\"MIT\"},\"src/plugin/ZeroDevSessionKeyPlugin.sol\":{\"content\":\"//SPDX-License-Identifier: GPL\\npragma solidity ^0.8.7;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./ZeroDevBasePlugin.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\\\";\\nusing ECDSA for bytes32;\\n/**\\n * Main EIP4337 module.\\n * Called (through the fallback module) using \\\"delegate\\\" from the GnosisSafe as an \\\"IAccount\\\",\\n * so must implement validateUserOp\\n * holds an immutable reference to the EntryPoint\\n */\\n\\nstruct ZeroDevSessionKeyStorageStruct {\\n mapping(address => bool) revoked;\\n}\\n\\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\\n // return value in case of signature failure, with no time-range.\\n // equivalent to packSigTimeRange(true,0,0);\\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\\n\\n event SessionKeyRevoked(address indexed key);\\n\\n constructor() EIP712(\\\"ZeroDevSessionKeyPlugin\\\", \\\"0.0.1\\\") {}\\n\\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\\n bytes32 position = bytes32(uint256(keccak256(\\\"zero-dev.account.eip4337.sessionkey\\\")) - 1);\\n assembly {\\n s.slot := position\\n }\\n }\\n\\n // revoke session key\\n function revokeSessionKey(address _key) external {\\n getPolicyStorage().revoked[_key] = true;\\n emit SessionKeyRevoked(_key);\\n }\\n\\n function revoked(address _key) external view returns (bool) {\\n return getPolicyStorage().revoked[_key];\\n }\\n\\n function _validatePluginData(\\n UserOperation calldata userOp,\\n bytes32 userOpHash,\\n bytes calldata data,\\n bytes calldata signature\\n ) internal view override returns (bool) {\\n address sessionKey = address(bytes20(data[0:20]));\\n require(!getPolicyStorage().revoked[sessionKey], \\\"session key revoked\\\");\\n bytes32 merkleRoot = bytes32(data[20:52]);\\n if(merkleRoot == bytes32(0)) {\\n // means this session key has sudo permission\\n signature = signature[33:98];\\n } else {\\n uint8 leafLength = uint8(signature[0]);\\n bytes32[] memory proof;\\n bytes32 leaf;\\n if(leafLength == 20) {\\n leaf = keccak256(signature[1:21]);\\n proof = abi.decode(signature[86:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n signature = signature[21:86];\\n } else if(leafLength == 24) {\\n leaf = keccak256(signature[1:25]);\\n proof = abi.decode(signature[90:], (bytes32[]));\\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \\\"invalid session key\\\");\\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\\n require(keccak256(sig) == keccak256(signature[21:25]));\\n signature = signature[25:90];\\n }\\n require(MerkleProof.verify(proof, merkleRoot, leaf), \\\"invalide merkle root\\\");\\n }\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n keccak256(\\\"Session(bytes32 userOpHash,uint256 nonce)\\\"), // we are going to trust plugin for verification\\n userOpHash,\\n userOp.nonce\\n )\\n )\\n );\\n address recovered = digest.recover(signature);\\n require(recovered == sessionKey, \\\"account: invalid signature\\\");\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0x7463f6b16e3dacf9d618a25e7cb6e12e210ff96682051c62d5a5d6e9243adb30\",\"license\":\"GPL\"}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280601781526020017f5a65726f44657653657373696f6e4b6579506c7567696e0000000000000000008152506040518060400160405280600581526020017f302e302e3100000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000e88184846200013760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200024b565b6000838383463060405160200162000154959493929190620001ee565b6040516020818303038152906040528051906020012090509392505050565b6000819050919050565b620001888162000173565b82525050565b6000819050919050565b620001a3816200018e565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b82525050565b600060a0820190506200020560008301886200017d565b6200021460208301876200017d565b6200022360408301866200017d565b62000232606083018562000198565b620002416080830184620001dd565b9695505050505050565b60805160a05160c05160e0516101005161012051611e016200029b6000396000610bac01526000610bee01526000610bcd01526000610b0201526000610b5801526000610b810152611e016000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806384f4fc6a14610051578063970aa9ad1461006d5780639e2045ce146100a0578063fa01dc06146100d0575b600080fd5b61006b60048036038101906100669190610fd2565b610100565b005b61008760048036038101906100829190611064565b6101a7565b604051610097949392919061110f565b60405180910390f35b6100ba60048036038101906100b591906111db565b6103ba565b6040516100c79190611265565b60405180910390f35b6100ea60048036038101906100e59190610fd2565b61040f565b6040516100f79190611265565b60405180910390f35b600161010a61046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f17c796fb82086b3c9effaec517342e5ca9ed8fd78c339137ec082f748ab60cbe60405160405180910390a250565b3660003660008086866000906020926101c29392919061128a565b906101cd91906112dd565b60001c90506000878783906020856101e5919061136b565b926101f29392919061128a565b906101fd91906112dd565b60001c9050600088886020906040926102189392919061128a565b9061022391906112dd565b60001c905060008989839060208561023b919061136b565b926102489392919061128a565b9061025391906112dd565b60001c90508989602086610267919061136b565b9085602088610276919061136b565b610280919061136b565b9261028d9392919061128a565b9750975089896020846102a0919061136b565b90836020866102af919061136b565b6102b9919061136b565b926102c69392919061128a565b9550955081602080856102d991906113ce565b6102e391906113ff565b6040866102f0919061136b565b6102fa919061136b565b1461033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103319061149e565b60405180910390fd5b898990506020808361034c91906113ce565b61035691906113ff565b604084610363919061136b565b61036d919061136b565b146103ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a49061150a565b60405180910390fd5b5050505092959194509250565b60003660003660006103ec888061014001906103d69190611539565b60619080926103e79392919061128a565b6101a7565b93509350935093506104028888868686866104ad565b9450505050509392505050565b600061041961046e565b60000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060017f6da8a1d7d4f224b5b2581a964c1890eb7e987638c691727e5a2a14ca24d03fd960001c6104a1919061159c565b60001b90508091505090565b60008085856000906014926104c49392919061128a565b906104cf91906115fc565b60601c90506104dc61046e565b60000160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561056a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610561906116a7565b60405180910390fd5b600086866014906034926105809392919061128a565b9061058b91906112dd565b90506000801b81036105b45784846021906062926105ab9392919061128a565b9450945061091a565b6000858560008181106105ca576105c96116c7565b5b9050013560f81c60f81b60f81c90506060600060148360ff16036106f55787876001906015926105fc9392919061128a565b60405161060a929190611726565b60405180910390209050878760569080926106279392919061128a565b810190610634919061187d565b9150878760019060159261064a9392919061128a565b604051610658929190611726565b60405180910390208c80606001906106709190611539565b6010906024926106829392919061128a565b604051610690929190611726565b6040518091039020146106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611912565b60405180910390fd5b87876015906056926106ec9392919061128a565b975097506108cc565b60188360ff16036108cb5787876001906019926107149392919061128a565b604051610722929190611726565b604051809103902090508787605a90809261073f9392919061128a565b81019061074c919061187d565b915087876001906015926107629392919061128a565b604051610770929190611726565b60405180910390208c80606001906107889190611539565b60109060249261079a9392919061128a565b6040516107a8929190611726565b6040518091039020146107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790611912565b60405180910390fd5b60008c80606001906108029190611539565b6044906064926108149392919061128a565b9061081f91906112dd565b60001c90503660008e80606001906108379190611539565b602485610844919061136b565b90602886610852919061136b565b9261085f9392919061128a565b915091508a8a6015906019926108779392919061128a565b604051610885929190611726565b6040518091039020828260405161089d929190611932565b6040518091039020146108af57600080fd5b8a8a601990605a926108c39392919061128a565b9a509a505050505b5b6108d7828583610a50565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611997565b60405180910390fd5b5050505b60006109737ff0a98eef9608fd8bfe5833dfbc8b73ab86d0355db37a1f539565c5985ad1c2428a8c60200135604051602001610958939291906119d5565b60405160208183030381529060405280519060200120610a67565b905060006109ce87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083610a8190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590611a58565b60405180910390fd5b60019450505050509695505050505050565b600082610a5d8584610aa8565b1490509392505050565b6000610a7a610a74610afe565b83610c18565b9050919050565b6000806000610a908585610c4b565b91509150610a9d81610c9c565b819250505092915050565b60008082905060005b8451811015610af357610ade82868381518110610ad157610ad06116c7565b5b6020026020010151610e02565b91508080610aeb90611a78565b915050610ab1565b508091505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b7a57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ba7577f00000000000000000000000000000000000000000000000000000000000000009050610c15565b610c127f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e2d565b90505b90565b60008282604051602001610c2d929190611b38565b60405160208183030381529060405280519060200120905092915050565b6000806041835103610c8c5760008060006020860151925060408601519150606086015160001a9050610c8087828585610e67565b94509450505050610c95565b60006002915091505b9250929050565b60006004811115610cb057610caf611b6f565b5b816004811115610cc357610cc2611b6f565b5b0315610dff5760016004811115610cdd57610cdc611b6f565b5b816004811115610cf057610cef611b6f565b5b03610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790611bea565b60405180910390fd5b60026004811115610d4457610d43611b6f565b5b816004811115610d5757610d56611b6f565b5b03610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90611c56565b60405180910390fd5b60036004811115610dab57610daa611b6f565b5b816004811115610dbe57610dbd611b6f565b5b03610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590611ce8565b60405180910390fd5b5b50565b6000818310610e1a57610e158284610f49565b610e25565b610e248383610f49565b5b905092915050565b60008383834630604051602001610e48959493929190611d17565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610ea2576000600391509150610f40565b600060018787878760405160008152602001604052604051610ec79493929190611d86565b6020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3757600060019250925050610f40565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f9f82610f74565b9050919050565b610faf81610f94565b8114610fba57600080fd5b50565b600081359050610fcc81610fa6565b92915050565b600060208284031215610fe857610fe7610f6a565b5b6000610ff684828501610fbd565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261102457611023610fff565b5b8235905067ffffffffffffffff81111561104157611040611004565b5b60208301915083600182028301111561105d5761105c611009565b5b9250929050565b6000806020838503121561107b5761107a610f6a565b5b600083013567ffffffffffffffff81111561109957611098610f6f565b5b6110a58582860161100e565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006110ee83856110b1565b93506110fb8385846110c2565b611104836110d1565b840190509392505050565b6000604082019050818103600083015261112a8186886110e2565b9050818103602083015261113f8184866110e2565b905095945050505050565b600080fd5b600061016082840312156111665761116561114a565b5b81905092915050565b6000819050919050565b6111828161116f565b811461118d57600080fd5b50565b60008135905061119f81611179565b92915050565b6000819050919050565b6111b8816111a5565b81146111c357600080fd5b50565b6000813590506111d5816111af565b92915050565b6000806000606084860312156111f4576111f3610f6a565b5b600084013567ffffffffffffffff81111561121257611211610f6f565b5b61121e8682870161114f565b935050602061122f86828701611190565b9250506040611240868287016111c6565b9150509250925092565b60008115159050919050565b61125f8161124a565b82525050565b600060208201905061127a6000830184611256565b92915050565b600080fd5b600080fd5b6000808585111561129e5761129d611280565b5b838611156112af576112ae611285565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006112e983836112c5565b826112f4813561116f565b925060208210156113345761132f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026112d0565b831692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611376826111a5565b9150611381836111a5565b92508282019050808211156113995761139861133c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006113d9826111a5565b91506113e4836111a5565b9250826113f4576113f361139f565b5b828204905092915050565b600061140a826111a5565b9150611415836111a5565b9250828202611423816111a5565b9150828204841483151761143a5761143961133c565b5b5092915050565b600082825260208201905092915050565b7f696e76616c696420646174610000000000000000000000000000000000000000600082015250565b6000611488600c83611441565b915061149382611452565b602082019050919050565b600060208201905081810360008301526114b78161147b565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006114f4601183611441565b91506114ff826114be565b602082019050919050565b60006020820190508181036000830152611523816114e7565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126115565761155561152a565b5b80840192508235915067ffffffffffffffff8211156115785761157761152f565b5b60208301925060018202360383131561159457611593611534565b5b509250929050565b60006115a7826111a5565b91506115b2836111a5565b92508282039050818111156115ca576115c961133c565b5b92915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600061160883836112c5565b8261161381356115d0565b925060148210156116535761164e7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000836014036008026112d0565b831692505b505092915050565b7f73657373696f6e206b6579207265766f6b656400000000000000000000000000600082015250565b6000611691601383611441565b915061169c8261165b565b602082019050919050565b600060208201905081810360008301526116c081611684565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b600061170d83856116f6565b935061171a8385846110c2565b82840190509392505050565b6000611733828486611701565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611777826110d1565b810181811067ffffffffffffffff821117156117965761179561173f565b5b80604052505050565b60006117a9610f60565b90506117b5828261176e565b919050565b600067ffffffffffffffff8211156117d5576117d461173f565b5b602082029050602081019050919050565b60006117f96117f4846117ba565b61179f565b9050808382526020820190506020840283018581111561181c5761181b611009565b5b835b8181101561184557806118318882611190565b84526020840193505060208101905061181e565b5050509392505050565b600082601f83011261186457611863610fff565b5b81356118748482602086016117e6565b91505092915050565b60006020828403121561189357611892610f6a565b5b600082013567ffffffffffffffff8111156118b1576118b0610f6f565b5b6118bd8482850161184f565b91505092915050565b7f696e76616c69642073657373696f6e206b657900000000000000000000000000600082015250565b60006118fc601383611441565b9150611907826118c6565b602082019050919050565b6000602082019050818103600083015261192b816118ef565b9050919050565b600061193f828486611701565b91508190509392505050565b7f696e76616c696465206d65726b6c6520726f6f74000000000000000000000000600082015250565b6000611981601483611441565b915061198c8261194b565b602082019050919050565b600060208201905081810360008301526119b081611974565b9050919050565b6119c08161116f565b82525050565b6119cf816111a5565b82525050565b60006060820190506119ea60008301866119b7565b6119f760208301856119b7565b611a0460408301846119c6565b949350505050565b7f6163636f756e743a20696e76616c6964207369676e6174757265000000000000600082015250565b6000611a42601a83611441565b9150611a4d82611a0c565b602082019050919050565b60006020820190508181036000830152611a7181611a35565b9050919050565b6000611a83826111a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ab557611ab461133c565b5b600182019050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b01600283611ac0565b9150611b0c82611acb565b600282019050919050565b6000819050919050565b611b32611b2d8261116f565b611b17565b82525050565b6000611b4382611af4565b9150611b4f8285611b21565b602082019150611b5f8284611b21565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611bd4601883611441565b9150611bdf82611b9e565b602082019050919050565b60006020820190508181036000830152611c0381611bc7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611c40601f83611441565b9150611c4b82611c0a565b602082019050919050565b60006020820190508181036000830152611c6f81611c33565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cd2602283611441565b9150611cdd82611c76565b604082019050919050565b60006020820190508181036000830152611d0181611cc5565b9050919050565b611d1181610f94565b82525050565b600060a082019050611d2c60008301886119b7565b611d3960208301876119b7565b611d4660408301866119b7565b611d5360608301856119c6565b611d606080830184611d08565b9695505050505050565b600060ff82169050919050565b611d8081611d6a565b82525050565b6000608082019050611d9b60008301876119b7565b611da86020830186611d77565b611db560408301856119b7565b611dc260608301846119b7565b9594505050505056fea26469706673582212205d61a7056fe6bfe6f67806ccdffcd495a3b016728c92d497f976c9d84670b56a64736f6c63430008120033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/polygon/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json b/deployments/polygon/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json deleted file mode 100644 index 7cdf9e6e..00000000 --- a/deployments/polygon/solcInputs/d5c4a417af7f759d03a3c7da438dc2be.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "lib/account-abstraction/contracts/core/EntryPoint.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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.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 \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\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 op\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, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\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(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\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 } //unchecked\n }\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 ) public 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 UserOperation[] 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 emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] 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(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\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 UserOperation[] 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 /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\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 */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\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 bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\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 //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\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 */\n function getUserOpHash(UserOperation 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 */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\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 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\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) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\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 calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\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 */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) 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 /**\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 */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\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 = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\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 */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\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 = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) 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 function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\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).\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, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private 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 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * 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 opIndex index in the batch\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 _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) 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 IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\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 */\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 function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n" - }, - "lib/account-abstraction/contracts/core/Helpers.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and 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 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 */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) 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// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\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 */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (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 */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (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 {\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" - }, - "lib/account-abstraction/contracts/core/NonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract 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 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 */\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" - }, - "lib/account-abstraction/contracts/core/SenderCreator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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 /**\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, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) 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 {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n" - }, - "lib/account-abstraction/contracts/core/StakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\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\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) 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 /// return the deposit (for gas payment) of the account\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 function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\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(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\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 /**\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(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\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(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(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" - }, - "lib/account-abstraction/contracts/interfaces/IAccount.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\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 able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_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 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(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\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(UserOperation 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(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n" - }, - "lib/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.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\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, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\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(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\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(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\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 */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\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\n * The string starts with a unique code \"AAmn\", 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 * 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 */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\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 */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\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 error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\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(UserOperation[] calldata ops, address payable beneficiary) 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 */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\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 sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\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\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (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, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n" - }, - "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\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" - }, - "lib/account-abstraction/contracts/interfaces/IPaymaster.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.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\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\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\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\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 * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, 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. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\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\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\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(\n address indexed account,\n uint256 withdrawTime\n );\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,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\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 uint112 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 /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\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(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n" - }, - "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\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 callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. 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 */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.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 function pack(UserOperation calldata userOp) 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 uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n" - }, - "lib/account-abstraction/contracts/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\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 {\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 {\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 {\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 {\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 {\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" - }, - "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\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 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 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 require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\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" - }, - "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(\n uint256 amount,\n bytes32 salt,\n bytes memory bytecode\n ) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(\n bytes32 salt,\n bytes32 bytecodeHash,\n address deployer\n ) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates merkle trees that are safe\n * against this attack out of the box.\n */\nlibrary MerkleProof {\n /**\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n * defined by `root`. For this, a `proof` must be provided, containing\n * sibling hashes on the branch from the leaf to the root of the tree. Each\n * pair of leaves and each pair of pre-images are assumed to be sorted.\n */\n function verify(\n bytes32[] memory proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProof(proof, leaf) == root;\n }\n\n /**\n * @dev Calldata version of {verify}\n *\n * _Available since v4.7._\n */\n function verifyCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32 leaf\n ) internal pure returns (bool) {\n return processProofCalldata(proof, leaf) == root;\n }\n\n /**\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n * hash matches the root of the tree. When processing the proof, the pairs\n * of leafs & pre-images are assumed to be sorted.\n *\n * _Available since v4.4._\n */\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Calldata version of {processProof}\n *\n * _Available since v4.7._\n */\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n bytes32 computedHash = leaf;\n for (uint256 i = 0; i < proof.length; i++) {\n computedHash = _hashPair(computedHash, proof[i]);\n }\n return computedHash;\n }\n\n /**\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerify(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProof(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Calldata version of {multiProofVerify}\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function multiProofVerifyCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32 root,\n bytes32[] memory leaves\n ) internal pure returns (bool) {\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n }\n\n /**\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n * respectively.\n *\n * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n *\n * _Available since v4.7._\n */\n function processMultiProof(\n bytes32[] memory proof,\n bool[] memory proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n /**\n * @dev Calldata version of {processMultiProof}.\n *\n * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.\n *\n * _Available since v4.7._\n */\n function processMultiProofCalldata(\n bytes32[] calldata proof,\n bool[] calldata proofFlags,\n bytes32[] memory leaves\n ) internal pure returns (bytes32 merkleRoot) {\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n // the merkle tree.\n uint256 leavesLen = leaves.length;\n uint256 totalHashes = proofFlags.length;\n\n // Check proof validity.\n require(leavesLen + proof.length - 1 == totalHashes, \"MerkleProof: invalid multiproof\");\n\n // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n bytes32[] memory hashes = new bytes32[](totalHashes);\n uint256 leafPos = 0;\n uint256 hashPos = 0;\n uint256 proofPos = 0;\n // At each step, we compute the next hash using two values:\n // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n // get the next hash.\n // - depending on the flag, either another value for the \"main queue\" (merging branches) or an element from the\n // `proof` array.\n for (uint256 i = 0; i < totalHashes; i++) {\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\n hashes[i] = _hashPair(a, b);\n }\n\n if (totalHashes > 0) {\n return hashes[totalHashes - 1];\n } else if (leavesLen > 0) {\n return leaves[0];\n } else {\n return proof[0];\n }\n }\n\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\n }\n\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, a)\n mstore(0x20, b)\n value := keccak256(0x00, 0x40)\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" - }, - "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" - }, - "src/abstract/Compatibility.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nabstract contract Compatibility {\n receive() external payable {}\n\n function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata)\n external\n pure\n returns (bytes4)\n {\n return this.onERC1155BatchReceived.selector;\n }\n\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view virtual returns (bytes4);\n}\n" - }, - "src/abstract/KernelStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\n\nstruct WalletKernelStorage {\n address owner;\n}\n\ncontract KernelStorage {\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n IEntryPoint public immutable entryPoint;\n\n event Upgraded(address indexed newImplementation);\n\n // modifier for checking if the sender is the entrypoint or\n // the account itself\n modifier onlyFromEntryPointOrOwnerOrSelf() {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner || msg.sender == address(this),\n \"account: not from entrypoint or owner or self\"\n );\n _;\n }\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n getKernelStorage().owner = address(1);\n }\n /// @notice get wallet kernel storage\n /// @dev used to get wallet kernel storage\n /// @return ws wallet kernel storage, consists of owner and nonces\n\n function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) {\n bytes32 storagePosition = bytes32(uint256(keccak256(\"zerodev.kernel\")) - 1);\n assembly {\n ws.slot := storagePosition\n }\n }\n\n function getOwner() external view returns (address) {\n return getKernelStorage().owner;\n }\n\n function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf {\n bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n assembly {\n sstore(slot, _newImplementation)\n }\n emit Upgraded(_newImplementation);\n }\n\n function transferOwnership(address _newOwner) external onlyFromEntryPointOrOwnerOrSelf {\n getKernelStorage().owner = _newOwner;\n }\n\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function getNonce(uint192 key) public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), key);\n }\n}\n " - }, - "src/factory/AccountFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./EIP1967Proxy.sol\";\nimport \"./MinimalAccount.sol\";\n\ncontract AccountFactory {\n MinimalAccount public immutable accountTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n accountTemplate = new MinimalAccount(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(accountTemplate), abi.encodeWithSelector(MinimalAccount.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(accountTemplate), abi.encodeCall(MinimalAccount.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/factory/EIP1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract EIP1967Proxy {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n constructor(address _logic, bytes memory _data) payable {\n require(_logic != address(0), \"EIP1967Proxy: implementation is the zero address\");\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n sstore(slot, _logic)\n }\n if (_data.length > 0) {\n (bool success,) = _logic.delegatecall(_data);\n require(success, \"EIP1967Proxy: constructor call failed\");\n }\n }\n\n fallback() external payable {\n address implementation = _implementation();\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 { revert(0, returndatasize()) }\n default { return(0, returndatasize()) }\n }\n }\n\n function _implementation() internal view returns (address impl) {\n bytes32 slot = _IMPLEMENTATION_SLOT;\n assembly {\n impl := sload(slot)\n }\n }\n}\n" - }, - "src/factory/MinimalAccount.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"account-abstraction/interfaces/UserOperation.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"src/utils/Exec.sol\";\nimport \"src/abstract/KernelStorage.sol\";\nimport \"src/abstract/Compatibility.sol\";\n\ncontract MinimalAccount is IAccount, KernelStorage, Compatibility {\n error InvalidNonce();\n\n constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {}\n\n function initialize(address _owner) external {\n require(getKernelStorage().owner == address(0), \"Already initialized\");\n getKernelStorage().owner = _owner;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds)\n external\n returns (uint256)\n {\n require(msg.sender == address(entryPoint), \"account: not from entrypoint\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n\n if (missingFunds > 0) {\n (bool success,) = msg.sender.call{value: missingFunds}(\"\");\n (success);\n }\n return 0;\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/Kernel.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"./plugin/IPlugin.sol\";\nimport \"account-abstraction/core/Helpers.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport {EntryPoint} from \"account-abstraction/core/EntryPoint.sol\";\nimport \"./utils/Exec.sol\";\nimport \"./abstract/Compatibility.sol\";\nimport \"./abstract/KernelStorage.sol\";\n\n/// @title Kernel\n/// @author taek\n/// @notice wallet kernel for minimal wallet functionality\n/// @dev supports only 1 owner, multiple plugins\ncontract Kernel is IAccount, EIP712, Compatibility, KernelStorage {\n error InvalidNonce();\n error InvalidSignatureLength();\n error QueryResult(bytes result);\n\n string public constant name = \"Kernel\";\n\n string public constant version = \"0.0.1\";\n\n constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {}\n\n /// @notice initialize wallet kernel\n /// @dev this function should be called only once, implementation initialize is blocked by owner = address(1)\n /// @param _owner owner address\n function initialize(address _owner) external {\n WalletKernelStorage storage ws = getKernelStorage();\n require(ws.owner == address(0), \"account: already initialized\");\n ws.owner = _owner;\n }\n\n /// @notice Query plugin for data\n /// @dev this function will always fail, it should be used only to query plugin for data using error message\n /// @param _plugin Plugin address\n /// @param _data Data to query\n function queryPlugin(address _plugin, bytes calldata _data) external {\n (bool success, bytes memory _ret) = Exec.delegateCall(_plugin, _data);\n if (success) {\n revert QueryResult(_ret);\n } else {\n assembly {\n revert(add(_ret, 32), mload(_ret))\n }\n }\n }\n\n /// @notice execute function call to external contract\n /// @dev this function will execute function call to external contract\n /// @param to target contract address\n /// @param value value to be sent\n /// @param data data to be sent\n /// @param operation operation type (call or delegatecall)\n function executeAndRevert(address to, uint256 value, bytes calldata data, Operation operation) external {\n require(\n msg.sender == address(entryPoint) || msg.sender == getKernelStorage().owner,\n \"account: not from entrypoint or owner\"\n );\n bool success;\n bytes memory ret;\n if (operation == Operation.DelegateCall) {\n (success, ret) = Exec.delegateCall(to, data);\n } else {\n (success, ret) = Exec.call(to, value, data);\n }\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n }\n\n /// @notice validate user operation\n /// @dev this function will validate user operation and be called by EntryPoint\n /// @param userOp user operation\n /// @param userOpHash user operation hash\n /// @param missingAccountFunds funds needed to be reimbursed\n /// @return validationData validation data\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (uint256 validationData)\n {\n require(msg.sender == address(entryPoint), \"account: not from entryPoint\");\n if (userOp.signature.length == 65) {\n validationData = _validateUserOp(userOp, userOpHash);\n } else if (userOp.signature.length > 97) {\n // userOp.signature = address(plugin) + validUntil + validAfter + pluginData + pluginSignature\n address plugin = address(bytes20(userOp.signature[0:20]));\n uint48 validUntil = uint48(bytes6(userOp.signature[20:26]));\n uint48 validAfter = uint48(bytes6(userOp.signature[26:32]));\n bytes memory signature = userOp.signature[32:97];\n (bytes memory data,) = abi.decode(userOp.signature[97:], (bytes, bytes));\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\n \"ValidateUserOpPlugin(address plugin,uint48 validUntil,uint48 validAfter,bytes data)\"\n ), // we are going to trust plugin for verification\n plugin,\n validUntil,\n validAfter,\n keccak256(data)\n )\n )\n );\n\n address signer = ECDSA.recover(digest, signature);\n if (getKernelStorage().owner != signer) {\n return SIG_VALIDATION_FAILED;\n }\n bytes memory ret = _delegateToPlugin(plugin, userOp, userOpHash, missingAccountFunds);\n bool res = abi.decode(ret, (bool));\n if (!res) {\n return SIG_VALIDATION_FAILED;\n }\n validationData = _packValidationData(!res, validUntil, validAfter);\n } else {\n revert InvalidSignatureLength();\n }\n if (missingAccountFunds > 0) {\n // we are going to assume signature is valid at this point\n (bool success,) = msg.sender.call{value: missingAccountFunds}(\"\");\n (success);\n return validationData;\n }\n }\n\n function _validateUserOp(UserOperation calldata userOp, bytes32 userOpHash)\n internal\n view\n returns (uint256 validationData)\n {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(userOpHash, userOp.signature)) {\n return validationData;\n }\n\n bytes32 hash = ECDSA.toEthSignedMessageHash(userOpHash);\n address recovered = ECDSA.recover(hash, userOp.signature);\n if (ws.owner != recovered) {\n return SIG_VALIDATION_FAILED;\n }\n }\n\n /**\n * delegate the contract call to the plugin\n */\n function _delegateToPlugin(\n address plugin,\n UserOperation calldata userOp,\n bytes32 opHash,\n uint256 missingAccountFunds\n ) internal returns (bytes memory) {\n bytes memory data =\n abi.encodeWithSelector(IPlugin.validatePluginData.selector, userOp, opHash, missingAccountFunds);\n (bool success, bytes memory ret) = Exec.delegateCall(plugin, data); // Q: should we allow value > 0?\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /// @notice validate signature using eip1271\n /// @dev this function will validate signature using eip1271\n /// @param _hash hash to be signed\n /// @param _signature signature\n function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4) {\n WalletKernelStorage storage ws = getKernelStorage();\n if (ws.owner == ECDSA.recover(_hash, _signature)) {\n return 0x1626ba7e;\n }\n bytes32 hash = ECDSA.toEthSignedMessageHash(_hash);\n address recovered = ECDSA.recover(hash, _signature);\n // Validate signatures\n if (ws.owner == recovered) {\n return 0x1626ba7e;\n } else {\n return 0xffffffff;\n }\n }\n}\n" - }, - "src/KernelFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/Create2.sol\";\nimport \"./factory/EIP1967Proxy.sol\";\nimport \"./Kernel.sol\";\n\ncontract KernelFactory {\n Kernel public immutable kernelTemplate;\n\n event AccountCreated(address indexed account, address indexed owner, uint256 index);\n\n constructor(IEntryPoint _entryPoint) {\n kernelTemplate = new Kernel(_entryPoint);\n }\n\n function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n address addr = Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n if (addr.code.length > 0) {\n return EIP1967Proxy(payable(addr));\n }\n proxy =\n new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeWithSelector(Kernel.initialize.selector, _owner));\n emit AccountCreated(address(proxy), _owner, _index);\n }\n\n function getAccountAddress(address _owner, uint256 _index) public view returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(_owner, _index));\n return Create2.computeAddress(\n salt,\n keccak256(\n abi.encodePacked(\n type(EIP1967Proxy).creationCode,\n abi.encode(address(kernelTemplate), abi.encodeCall(Kernel.initialize, (_owner)))\n )\n )\n );\n }\n}\n" - }, - "src/plugin/IPlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"account-abstraction/interfaces/UserOperation.sol\";\n\ninterface IPlugin {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n returns (bool);\n}\n" - }, - "src/plugin/ZeroDevBasePlugin.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\";\nimport \"account-abstraction/interfaces/IAccount.sol\";\nimport \"account-abstraction/interfaces/IEntryPoint.sol\";\nimport \"./IPlugin.sol\";\nabstract contract ZeroDevBasePlugin is IPlugin, EIP712 {\n function validatePluginData(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n override\n returns (bool validated)\n {\n // data offset starts at 97\n (bytes calldata data, bytes calldata signature) = parseDataAndSignature(userOp.signature[97:]);\n validated = _validatePluginData(userOp, userOpHash, data, signature);\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal virtual returns (bool success);\n\n function parseDataAndSignature(bytes calldata _packed)\n public\n pure\n returns (bytes calldata data, bytes calldata signature)\n {\n uint256 dataPosition = uint256(bytes32(_packed[0:32]));\n uint256 dataLength = uint256(bytes32(_packed[dataPosition:dataPosition + 32]));\n uint256 signaturePosition = uint256(bytes32(_packed[32:64]));\n uint256 signatureLength = uint256(bytes32(_packed[signaturePosition:signaturePosition + 32]));\n data = _packed[dataPosition + 32:dataPosition + 32 + dataLength];\n signature = _packed[signaturePosition + 32:signaturePosition + 32 + signatureLength];\n\n require(dataPosition + 64 + ((dataLength) / 32) * 32 == signaturePosition, \"invalid data\");\n require(signaturePosition + 64 + ((signatureLength) / 32) * 32 == _packed.length, \"invalid signature\");\n }\n}\n" - }, - "src/plugin/ZeroDevSessionKeyPlugin.sol": { - "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./ZeroDevBasePlugin.sol\";\nimport \"openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol\";\nusing ECDSA for bytes32;\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n */\n\nstruct ZeroDevSessionKeyStorageStruct {\n mapping(address => bool) revoked;\n}\n\ncontract ZeroDevSessionKeyPlugin is ZeroDevBasePlugin {\n // return value in case of signature failure, with no time-range.\n // equivalent to packSigTimeRange(true,0,0);\n uint256 internal constant SIG_VALIDATION_FAILED = 1;\n\n event SessionKeyRevoked(address indexed key);\n\n constructor() EIP712(\"ZeroDevSessionKeyPlugin\", \"0.0.1\") {}\n\n function getPolicyStorage() internal pure returns (ZeroDevSessionKeyStorageStruct storage s) {\n bytes32 position = bytes32(uint256(keccak256(\"zero-dev.account.eip4337.sessionkey\")) - 1);\n assembly {\n s.slot := position\n }\n }\n\n // revoke session key\n function revokeSessionKey(address _key) external {\n getPolicyStorage().revoked[_key] = true;\n emit SessionKeyRevoked(_key);\n }\n\n function revoked(address _key) external view returns (bool) {\n return getPolicyStorage().revoked[_key];\n }\n\n function _validatePluginData(\n UserOperation calldata userOp,\n bytes32 userOpHash,\n bytes calldata data,\n bytes calldata signature\n ) internal view override returns (bool) {\n address sessionKey = address(bytes20(data[0:20]));\n require(!getPolicyStorage().revoked[sessionKey], \"session key revoked\");\n bytes32 merkleRoot = bytes32(data[20:52]);\n if(merkleRoot == bytes32(0)) {\n // means this session key has sudo permission\n signature = signature[33:98];\n } else {\n uint8 leafLength = uint8(signature[0]);\n bytes32[] memory proof;\n bytes32 leaf;\n if(leafLength == 20) {\n leaf = keccak256(signature[1:21]);\n proof = abi.decode(signature[86:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n signature = signature[21:86];\n } else if(leafLength == 24) {\n leaf = keccak256(signature[1:25]);\n proof = abi.decode(signature[90:], (bytes32[]));\n require(keccak256(userOp.callData[16:36]) == keccak256(signature[1:21]), \"invalid session key\");\n uint256 offset = uint256(bytes32(userOp.callData[68:100]));\n bytes calldata sig = userOp.callData[offset + 36: offset + 40];\n require(keccak256(sig) == keccak256(signature[21:25]));\n signature = signature[25:90];\n }\n require(MerkleProof.verify(proof, merkleRoot, leaf), \"invalide merkle root\");\n }\n bytes32 digest = _hashTypedDataV4(\n keccak256(\n abi.encode(\n keccak256(\"Session(bytes32 userOpHash,uint256 nonce)\"), // we are going to trust plugin for verification\n userOpHash,\n userOp.nonce\n )\n )\n );\n address recovered = digest.recover(signature);\n require(recovered == sessionKey, \"account: invalid signature\");\n return true;\n }\n}\n" - }, - "src/test/TestCounter.sol": { - "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\ncontract TestCounter {\n uint256 public counter;\n function increment() public {\n counter += 1;\n }\n}" - }, - "src/utils/Exec.sol": { - "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\nenum Operation {\n Call,\n DelegateCall\n}\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) {\n assembly {\n success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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 function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) {\n assembly {\n success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "remappings": [ - "@openzeppelin/=lib/openzeppelin-contracts/", - "account-abstraction/=lib/account-abstraction/contracts/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/" - ] - } -} \ No newline at end of file diff --git a/src/abstract/KernelStorage.sol b/src/abstract/KernelStorage.sol index 634c3ac5..36261ede 100644 --- a/src/abstract/KernelStorage.sol +++ b/src/abstract/KernelStorage.sol @@ -23,7 +23,7 @@ struct WalletKernelStorage { } /// @title Kernel Storage Contract -/// @author Your Name +/// @author taek /// @notice This contract serves as the storage module for the Kernel contract. /// @dev This contract should only be used by the main Kernel contract. contract KernelStorage { diff --git a/src/factory/MultiECDSAKernelFactory.sol b/src/factory/MultiECDSAKernelFactory.sol new file mode 100644 index 00000000..c596b8b2 --- /dev/null +++ b/src/factory/MultiECDSAKernelFactory.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "./KernelFactory.sol"; +import "src/validator/MultiECDSAValidator.sol"; +import "src/interfaces/IAddressBook.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract MultiECDSAKernelFactory is IAddressBook, Ownable { + KernelFactory public immutable singletonFactory; + MultiECDSAValidator public immutable validator; + IEntryPoint public immutable entryPoint; + + address[] public owners; + + constructor(KernelFactory _singletonFactory, MultiECDSAValidator _validator, IEntryPoint _entryPoint) { + singletonFactory = _singletonFactory; + validator = _validator; + entryPoint = _entryPoint; + } + + function setOwners(address[] calldata _owners) external onlyOwner { + owners = _owners; + } + + function getOwners() external view override returns(address[] memory) { + return owners; + } + + function createAccount(uint256 _index) external returns (EIP1967Proxy proxy) { + bytes memory data = abi.encodePacked(address(this)); + proxy = singletonFactory.createAccount(validator, data, _index); + } + + function getAccountAddress(uint256 _index) public view returns (address) { + bytes memory data = abi.encodePacked(address(this)); + return singletonFactory.getAccountAddress(validator, data, _index); + } + + /** + * add a deposit for this factory, used for paying for transaction fees + */ + function deposit() public payable { + entryPoint.depositTo{value : msg.value}(address(this)); + } + + /** + * withdraw value from the deposit + * @param withdrawAddress target to send to + * @param amount to withdraw + */ + function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner { + entryPoint.withdrawTo(withdrawAddress, amount); + } + /** + * add stake for this factory. + * This method can also carry eth value to add to the current stake. + * @param unstakeDelaySec - the unstake delay for this factory. Can only be increased. + */ + function addStake(uint32 unstakeDelaySec) external payable onlyOwner { + entryPoint.addStake{value : msg.value}(unstakeDelaySec); + } + + /** + * return current factory's deposit on the entryPoint. + */ + function getDeposit() public view returns (uint256) { + return entryPoint.balanceOf(address(this)); + } + + /** + * unlock the stake, in order to withdraw it. + * The factory can't serve requests once unlocked, until it calls addStake again + */ + function unlockStake() external onlyOwner { + entryPoint.unlockStake(); + } + + /** + * withdraw the entire factory's stake. + * stake must be unlocked first (and then wait for the unstakeDelay to be over) + * @param withdrawAddress the address to send withdrawn value. + */ + function withdrawStake(address payable withdrawAddress) external onlyOwner { + entryPoint.withdrawStake(withdrawAddress); + } +} diff --git a/src/interfaces/IAddressBook.sol b/src/interfaces/IAddressBook.sol new file mode 100644 index 00000000..19acad9b --- /dev/null +++ b/src/interfaces/IAddressBook.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +interface IAddressBook { + function getOwners() external view returns(address[] memory); +} diff --git a/src/utils/KernelHelper.sol b/src/utils/KernelHelper.sol index b78ca7cb..70fee93d 100644 --- a/src/utils/KernelHelper.sol +++ b/src/utils/KernelHelper.sol @@ -7,12 +7,18 @@ function _intersectValidationData(uint256 a, uint256 b) pure returns (uint256 va if (uint160(a) != uint160(b)) { return SIG_VALIDATION_FAILED; } - uint48 validAfterA = uint48(a >> 160); - uint48 validUntilA = uint48(a >> (48 + 160)); - uint48 validAfterB = uint48(b >> 160); - uint48 validUntilB = uint48(b >> (48 + 160)); + uint48 validAfterA = uint48(a >> (160 + 48)); + uint48 validUntilA = uint48(a >> 160); + if(validUntilA == 0) { + validUntilA = type(uint48).max; + } + uint48 validAfterB = uint48(b >> (160 + 48)); + uint48 validUntilB = uint48(b >> 160); + if(validUntilB == 0) { + validUntilB = type(uint48).max; + } if (validAfterA < validAfterB) validAfterA = validAfterB; if (validUntilA > validUntilB) validUntilA = validUntilB; - validationData = uint256(uint160(a)) | (uint256(validAfterA) << 160) | (uint256(validUntilA) << (48 + 160)); + validationData = uint256(uint160(a)) | (uint256(validUntilA) << 160) | (uint256(validAfterA) << (48 + 160)); } diff --git a/src/validator/MultiECDSAValidator.sol b/src/validator/MultiECDSAValidator.sol new file mode 100644 index 00000000..47051150 --- /dev/null +++ b/src/validator/MultiECDSAValidator.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./IValidator.sol"; +import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; +import "src/utils/KernelHelper.sol"; +import "src/interfaces/IAddressBook.sol"; + +contract MultiECDSAValidator is IKernelValidator { + event OwnerAdded(address indexed kernel, address indexed owner); + event OwnerRemoved(address indexed kernel, address indexed owner); + + mapping(address owner => mapping(address kernel => bool) hello) public isOwner; + + function disable(bytes calldata _data) external override { + address[] memory owners = abi.decode(_data, (address[])); + for (uint256 i = 0; i < owners.length; i++) { + isOwner[owners[i]][msg.sender] = false; + emit OwnerRemoved(msg.sender, owners[i]); + } + } + + function enable(bytes calldata _data) external override { + address addressBook = address(bytes20(_data)); + address[] memory owners = IAddressBook(addressBook).getOwners(); + for (uint256 i = 0; i < owners.length; i++) { + isOwner[owners[i]][msg.sender] = true; + emit OwnerAdded(msg.sender, owners[i]); + } + } + + function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) + external + view + override + returns (uint256 validationData) + { + address signer = ECDSA.recover(_userOpHash, _userOp.signature); + if (isOwner[signer][msg.sender]) { + return 0; + } + + bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); + signer = ECDSA.recover(hash, _userOp.signature); + if (!isOwner[signer][msg.sender]) { + return SIG_VALIDATION_FAILED; + } + return 0; + } + + function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { + address signer = ECDSA.recover(hash, signature); + if(isOwner[signer][msg.sender]) { + return 0; + } + bytes32 ethHash = ECDSA.toEthSignedMessageHash(hash); + signer = ECDSA.recover(ethHash, signature); + if (!isOwner[signer][msg.sender]) { + return SIG_VALIDATION_FAILED; + } + return 0; + } +} diff --git a/test/foundry/KernelHelper.test.sol b/test/foundry/KernelHelper.test.sol new file mode 100644 index 00000000..3294888f --- /dev/null +++ b/test/foundry/KernelHelper.test.sol @@ -0,0 +1,26 @@ +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; +import "src/utils/KernelHelper.sol"; +import "account-abstraction/core/Helpers.sol"; + +contract KernelHelperTest is Test { + function testIntersect(uint48 validAfterA, uint48 validUntilA, uint48 validAfterB, uint48 validUntilB) public { + if(validUntilB == 0) { + validUntilB = 0xffffffffffff; + } + if(validUntilA == 0) { + validUntilA = 0xffffffffffff; + } + uint256 a = _packValidationData(false, validUntilA, validAfterA); + uint256 b = _packValidationData(false, validUntilB, validAfterB); + ValidationData memory c = _intersectTimeRange(a, b); + + uint256 expected = _packValidationData( + false, + validUntilA < validUntilB ? validUntilA : validUntilB, + validAfterA > validAfterB ? validAfterA : validAfterB + ); + assertEq(_packValidationData(c), expected); + } +} diff --git a/test/foundry/KernelMultiOwned.test.sol b/test/foundry/KernelMultiOwned.test.sol new file mode 100644 index 00000000..c2222aa6 --- /dev/null +++ b/test/foundry/KernelMultiOwned.test.sol @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "src/factory/KernelFactory.sol"; +import "src/factory/TempKernel.sol"; +import "src/factory/MultiECDSAKernelFactory.sol"; +import "src/Kernel.sol"; +import "src/validator/MultiECDSAValidator.sol"; +import "src/factory/EIP1967Proxy.sol"; +// test artifacts +import "src/test/TestValidator.sol"; +// test utils +import "forge-std/Test.sol"; +import {ERC4337Utils} from "./ERC4337Utils.sol"; + +using ERC4337Utils for EntryPoint; + +contract KernelTest is Test { + Kernel kernel; + KernelFactory factory; + MultiECDSAKernelFactory ecdsaFactory; + EntryPoint entryPoint; + MultiECDSAValidator validator; + address owner; + uint256 ownerKey; + address payable beneficiary; + + function setUp() public { + (owner, ownerKey) = makeAddrAndKey("owner"); + entryPoint = new EntryPoint(); + factory = new KernelFactory(entryPoint); + + validator = new MultiECDSAValidator(); + ecdsaFactory = new MultiECDSAKernelFactory(factory, validator, entryPoint); + address[] memory owners = new address[](1); + owners[0] = owner; + ecdsaFactory.setOwners(owners); + + kernel = Kernel(payable(ecdsaFactory.createAccount(0))); + vm.deal(address(kernel), 1e30); + beneficiary = payable(address(makeAddr("beneficiary"))); + } + + function test_initialize_twice() external { + vm.expectRevert(); + kernel.initialize(validator, abi.encodePacked(owner)); + } + + function test_validate_signature() external { + Kernel kernel2 = Kernel(payable(address(ecdsaFactory.createAccount(1)))); + bytes32 hash = keccak256(abi.encodePacked("hello world")); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, hash); + assertEq(kernel2.isValidSignature(hash, abi.encodePacked(r, s, v)), Kernel.isValidSignature.selector); + } + + function test_set_default_validator() external { + TestValidator newValidator = new TestValidator(); + bytes memory empty; + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(KernelStorage.setDefaultValidator.selector, address(newValidator), empty) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + assertEq(address(KernelStorage(address(kernel)).getDefaultValidator()), address(newValidator)); + } + + function test_disable_mode() external { + bytes memory empty; + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + assertEq(uint256(bytes32(KernelStorage(address(kernel)).getDisabledMode())), 1 << 224); + } + + function test_set_execution() external { + console.log("owner", owner); + TestValidator newValidator = new TestValidator(); + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector( + KernelStorage.setExecution.selector, + bytes4(0xdeadbeef), + address(0xdead), + address(newValidator), + uint48(0), + uint48(0), + bytes("") + ) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + ExecutionDetail memory execution = KernelStorage(address(kernel)).getExecution(bytes4(0xdeadbeef)); + assertEq(execution.executor, address(0xdead)); + assertEq(address(execution.validator), address(newValidator)); + assertEq(uint256(execution.validUntil), uint256(0)); + assertEq(uint256(execution.validAfter), uint256(0)); + } + + function test_callcode() external { + CallCodeTester t = new CallCodeTester(); + address(t).call{value: 1e18}(""); + Target target = new Target(); + t.callcodeTest(address(target)); + console.log("target balance", address(target).balance); + console.log("t balance", address(t).balance); + console.log("t slot1", t.slot1()); + console.log("t slot2", t.slot2()); + } +} + +contract CallCodeTester { + uint256 public slot1; + uint256 public slot2; + receive() external payable { + } + function callcodeTest(address _target) external { + bool success; + bytes memory ret; + uint256 b = address(this).balance / 1000; + bytes memory data; + assembly { + let result := callcode(gas(), _target, b, add(data, 0x20), mload(data), 0, 0) + // Load free memory location + let ptr := mload(0x40) + // We allocate memory for the return data by setting the free memory location to + // current free memory location + data size + 32 bytes for data size value + mstore(0x40, add(ptr, add(returndatasize(), 0x20))) + // Store the size + mstore(ptr, returndatasize()) + // Store the data + returndatacopy(add(ptr, 0x20), 0, returndatasize()) + // Point the return data to the correct memory location + ret := ptr + success := result + } + require(success, "callcode failed"); + } +} + +contract Target { + uint256 public count; + uint256 public amount; + fallback() external payable { + count++; + amount += msg.value; + } +} From 0369fbbb0dc875a58692d58dc3ea548a68209534 Mon Sep 17 00:00:00 2001 From: taek Date: Tue, 13 Jun 2023 01:33:06 +0900 Subject: [PATCH 03/33] ERC721 actions renamed to token actions and added erc20, erc1155 (#10) --- src/executor/ERC721Actions.sol | 10 ---------- src/executor/TokenActions.sol | 19 +++++++++++++++++++ test/foundry/KernelExecution.test.sol | 12 ++++++------ 3 files changed, 25 insertions(+), 16 deletions(-) delete mode 100644 src/executor/ERC721Actions.sol create mode 100644 src/executor/TokenActions.sol diff --git a/src/executor/ERC721Actions.sol b/src/executor/ERC721Actions.sol deleted file mode 100644 index bc6aaacf..00000000 --- a/src/executor/ERC721Actions.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; - -contract ERC721Actions { - function transferERC721Action(address _token, uint256 _id, address _to) external { - IERC721(_token).transferFrom(address(this), _to, _id); - } -} diff --git a/src/executor/TokenActions.sol b/src/executor/TokenActions.sol new file mode 100644 index 00000000..37b7bcf2 --- /dev/null +++ b/src/executor/TokenActions.sol @@ -0,0 +1,19 @@ +pragma solidity ^0.8.0; + +import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; +import "openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol"; + +contract TokenActions { + function transfer20Action(address _token, uint256 _amount, address _to) external { + IERC20(_token).transfer(_to, _amount); + } + + function transferERC721Action(address _token, uint256 _id, address _to) external { + IERC721(_token).transferFrom(address(this), _to, _id); + } + + function transferERC1155Action(address _token, uint256 _id, address _to, uint256 amount, bytes calldata data) external { + IERC1155(_token).safeTransferFrom(address(this), _to, _id, amount, data); + } +} diff --git a/test/foundry/KernelExecution.test.sol b/test/foundry/KernelExecution.test.sol index 1dbeb0e7..263b052b 100644 --- a/test/foundry/KernelExecution.test.sol +++ b/test/foundry/KernelExecution.test.sol @@ -15,7 +15,7 @@ import "forge-std/Test.sol"; import {ERC4337Utils} from "./ERC4337Utils.sol"; // test actions/validators import "src/validator/ERC165SessionKeyValidator.sol"; -import "src/executor/ERC721Actions.sol"; +import "src/executor/TokenActions.sol"; using ERC4337Utils for EntryPoint; @@ -148,13 +148,13 @@ contract KernelExecutionTest is Test { function test_mode_2_erc165() external { ERC165SessionKeyValidator sessionKeyValidator = new ERC165SessionKeyValidator(); - ERC721Actions action = new ERC721Actions(); + TokenActions action = new TokenActions(); TestERC721 erc721 = new TestERC721(); erc721.mint(address(kernel), 0); erc721.mint(address(kernel), 1); UserOperation memory op = entryPoint.fillUserOp( address(kernel), - abi.encodeWithSelector(ERC721Actions.transferERC721Action.selector, address(erc721), 0, address(0xdead)) + abi.encodeWithSelector(TokenActions.transferERC721Action.selector, address(erc721), 0, address(0xdead)) ); address sessionKeyAddr; uint256 sessionKeyPriv; @@ -162,7 +162,7 @@ contract KernelExecutionTest is Test { bytes memory enableData = abi.encodePacked( sessionKeyAddr, type(IERC721).interfaceId, - ERC721Actions.transferERC721Action.selector, + TokenActions.transferERC721Action.selector, uint48(0), uint48(0), uint32(16) @@ -170,7 +170,7 @@ contract KernelExecutionTest is Test { { bytes32 digest = getTypedDataHash( address(kernel), - ERC721Actions.transferERC721Action.selector, + TokenActions.transferERC721Action.selector, 0, 0, address(sessionKeyValidator), @@ -203,7 +203,7 @@ contract KernelExecutionTest is Test { op = entryPoint.fillUserOp( address(kernel), - abi.encodeWithSelector(ERC721Actions.transferERC721Action.selector, address(erc721), 1, address(0xdead)) + abi.encodeWithSelector(TokenActions.transferERC721Action.selector, address(erc721), 1, address(0xdead)) ); op.signature = abi.encodePacked(bytes4(0x00000001), entryPoint.signUserOpHash(vm, sessionKeyPriv, op)); ops[0] = op; From 43835f0cec1ea8c5ff6ae2c8221c8943705624a5 Mon Sep 17 00:00:00 2001 From: taek Date: Tue, 27 Jun 2023 00:15:09 +0900 Subject: [PATCH 04/33] Feat/killswitch (#11) * v4.0.0-beta.10 * v4.0.0-beta.11 * v4.0.0-beta.12 * changed killswitch validator to plugin * v4.0.0-beta.13 --- .gitmodules | 3 + lib/solady | 1 + package.json | 2 +- src/executor/KillSwitchAction.sol | 25 ++++ src/validator/KillSwitchValidator.sol | 63 +++++---- test/foundry/KillSwitch.t.sol | 188 ++++++++++++++++++++++++++ 6 files changed, 254 insertions(+), 28 deletions(-) create mode 160000 lib/solady create mode 100644 src/executor/KillSwitchAction.sol create mode 100644 test/foundry/KillSwitch.t.sol diff --git a/.gitmodules b/.gitmodules index ac2a4fe4..918f59a3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ path = lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts branch = v4.8.2 +[submodule "lib/solady"] + path = lib/solady + url = https://github.com/vectorized/solady diff --git a/lib/solady b/lib/solady new file mode 160000 index 00000000..50cbe190 --- /dev/null +++ b/lib/solady @@ -0,0 +1 @@ +Subproject commit 50cbe1909e773b7e4ba76049c75a203e626d55ba diff --git a/package.json b/package.json index 408f70c8..fe428eb5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@zerodevapp/contracts", "description": "ZeroDev Account Abstraction (EIP 4337) contracts", "main": "./dist/index.js", - "version": "4.0.0-beta.9", + "version": "4.0.0-beta.13", "scripts": { "prepack": "./scripts/prepack-contracts-package.sh", "postpack": "./scripts/postpack-contracts-package.sh" diff --git a/src/executor/KillSwitchAction.sol b/src/executor/KillSwitchAction.sol new file mode 100644 index 00000000..6a0f455b --- /dev/null +++ b/src/executor/KillSwitchAction.sol @@ -0,0 +1,25 @@ +import "src/validator/IValidator.sol"; +import "src/abstract/KernelStorage.sol"; + +contract KillSwitchAction { + IKernelValidator public immutable killSwitchValidator; + + constructor(IKernelValidator _killswitchValidator) { + killSwitchValidator = _killswitchValidator; + } + + // Function to get the wallet kernel storage + function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) { + bytes32 storagePosition = bytes32(uint256(keccak256("zerodev.kernel")) - 1); + assembly { + ws.slot := storagePosition + } + } + + function activateKillSwitch() external { + WalletKernelStorage storage ws = getKernelStorage(); + ws.defaultValidator = killSwitchValidator; + getKernelStorage().disabledMode = bytes4(0xffffffff); + getKernelStorage().lastDisabledTime = uint48(block.timestamp); + } +} diff --git a/src/validator/KillSwitchValidator.sol b/src/validator/KillSwitchValidator.sol index 3840e310..f72f3937 100644 --- a/src/validator/KillSwitchValidator.sol +++ b/src/validator/KillSwitchValidator.sol @@ -7,11 +7,13 @@ import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; import "src/utils/KernelHelper.sol"; import "account-abstraction/core/Helpers.sol"; import "src/Kernel.sol"; +import { WalletKernelStorage, ExecutionDetail} from "src/abstract/KernelStorage.sol"; import "./ECDSAValidator.sol"; + struct KillSwitchValidatorStorage { - address owner; address guardian; + IKernelValidator validator; uint48 pausedUntil; } @@ -19,8 +21,7 @@ contract KillSwitchValidator is IKernelValidator { mapping(address => KillSwitchValidatorStorage) public killSwitchValidatorStorage; function enable(bytes calldata enableData) external override { - killSwitchValidatorStorage[msg.sender].owner = address(bytes20(enableData[0:20])); - killSwitchValidatorStorage[msg.sender].guardian = address(bytes20(enableData[20:40])); + killSwitchValidatorStorage[msg.sender].guardian = address(bytes20(enableData[0:20])); } function disable(bytes calldata) external override { @@ -29,9 +30,13 @@ contract KillSwitchValidator is IKernelValidator { function validateSignature(bytes32 hash, bytes calldata signature) external view override returns (uint256) { KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[msg.sender]; - return _packValidationData( - validatorStorage.owner != ECDSA.recover(hash, signature), 0, validatorStorage.pausedUntil - ); + uint256 res = validatorStorage.validator.validateSignature(hash,signature); + uint48 pausedUntil = validatorStorage.pausedUntil; + ValidationData memory validationData = _parseValidationData(res); + if(validationData.aggregator != address(1)) { // if signature verification has not been failed, return with the result + uint256 delayedData = _packValidationData(false, 0, pausedUntil); + return _packValidationData(_intersectTimeRange(res, delayedData)); + } } function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) @@ -39,30 +44,34 @@ contract KillSwitchValidator is IKernelValidator { override returns (uint256) { - address signer; - bytes calldata signature; KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[_userOp.sender]; - if (_userOp.signature.length == 6 + 65) { - require(bytes4(_userOp.callData[0:4]) != KernelStorage.disableMode.selector); - signer = validatorStorage.guardian; - uint48 pausedUntil = uint48(bytes6(_userOp.signature[0:6])); - require(pausedUntil > validatorStorage.pausedUntil, "KillSwitchValidator: invalid pausedUntil"); - killSwitchValidatorStorage[_userOp.sender].pausedUntil = pausedUntil; - signature = _userOp.signature[6:71]; - } else { - signer = killSwitchValidatorStorage[_userOp.sender].owner; - signature = _userOp.signature; + uint48 pausedUntil = validatorStorage.pausedUntil; + uint256 validationResult = 0; + if(address(validatorStorage.validator) != address(0)){ + // check for validator at first + try validatorStorage.validator.validateUserOp(_userOp, _userOpHash, pausedUntil) returns (uint256 res) { + validationResult = res; + } catch { + validationResult = SIG_VALIDATION_FAILED; + } + ValidationData memory validationData = _parseValidationData(validationResult); + if(validationData.aggregator != address(1)) { // if signature verification has not been failed, return with the result + uint256 delayedData = _packValidationData(false, 0, pausedUntil); + return _packValidationData(_intersectTimeRange(validationResult, delayedData)); + } } - if (signer == ECDSA.recover(_userOpHash, signature)) { - // address(0) attack has been resolved in ECDSA library - return _packValidationData(false, 0, validatorStorage.pausedUntil); - } - - bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); - address recovered = ECDSA.recover(hash, signature); - if (signer != recovered) { + if(_userOp.signature.length == 71) { + // save data to this storage + validatorStorage.pausedUntil = uint48(bytes6(_userOp.signature[0:6])); + validatorStorage.validator = KernelStorage(msg.sender).getDefaultValidator(); + bytes32 hash = ECDSA.toEthSignedMessageHash(keccak256(bytes.concat(_userOp.signature[0:6],_userOpHash))); + address recovered = ECDSA.recover(hash, _userOp.signature[6:]); + if (validatorStorage.guardian != recovered) { + return SIG_VALIDATION_FAILED; + } + return _packValidationData(false, 0, pausedUntil); + } else { return SIG_VALIDATION_FAILED; } - return _packValidationData(false, 0, validatorStorage.pausedUntil); } } diff --git a/test/foundry/KillSwitch.t.sol b/test/foundry/KillSwitch.t.sol new file mode 100644 index 00000000..d285afce --- /dev/null +++ b/test/foundry/KillSwitch.t.sol @@ -0,0 +1,188 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "src/factory/KernelFactory.sol"; +import "src/factory/TempKernel.sol"; +import "src/validator/ECDSAValidator.sol"; +import "src/factory/ECDSAKernelFactory.sol"; +import "src/Kernel.sol"; +import "src/validator/KillSwitchValidator.sol"; +import "src/executor/KillSwitchAction.sol"; +import "src/factory/EIP1967Proxy.sol"; +// test utils +import "forge-std/Test.sol"; +import {ERC4337Utils} from "./ERC4337Utils.sol"; + +using ERC4337Utils for EntryPoint; + +contract KernelExecutionTest is Test { + Kernel kernel; + KernelFactory factory; + ECDSAKernelFactory ecdsaFactory; + EntryPoint entryPoint; + ECDSAValidator validator; + + KillSwitchValidator killSwitch; + KillSwitchAction action; + address owner; + uint256 ownerKey; + address payable beneficiary; + + function setUp() public { + (owner, ownerKey) = makeAddrAndKey("owner"); + entryPoint = new EntryPoint(); + factory = new KernelFactory(entryPoint); + + validator = new ECDSAValidator(); + ecdsaFactory = new ECDSAKernelFactory(factory, validator, entryPoint); + + kernel = Kernel(payable(address(ecdsaFactory.createAccount(owner, 0)))); + vm.deal(address(kernel), 1e30); + beneficiary = payable(address(makeAddr("beneficiary"))); + killSwitch = new KillSwitchValidator(); + action = new KillSwitchAction(killSwitch); + } + + function test_mode_2() external { + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(Kernel.execute.selector, owner, 0, "", Operation.Call) + ); + + op.signature = bytes.concat(bytes4(0), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + + + op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(KillSwitchAction.activateKillSwitch.selector) + ); + address guardianKeyAddr; + uint256 guardianKeyPriv; + (guardianKeyAddr, guardianKeyPriv) = makeAddrAndKey("guardianKey"); + bytes memory enableData = abi.encodePacked( + guardianKeyAddr + ); + { + bytes32 digest = getTypedDataHash( + address(kernel), + KillSwitchAction.activateKillSwitch.selector, + 0, + 0, + address(killSwitch), + address(action), + enableData + ); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); + + op.signature = abi.encodePacked( + bytes4(0x00000002), + uint48(0), + uint48(0), + address(killSwitch), + address(action), + uint256(enableData.length), + enableData, + uint256(65), + r, + s, + v + ); + } + + uint256 pausedUntil = block.timestamp + 1000; + + bytes32 hash = entryPoint.getUserOpHash(op); + { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(guardianKeyPriv, ECDSA.toEthSignedMessageHash(keccak256(bytes.concat(bytes6(uint48(pausedUntil)),hash)))); + bytes memory sig = abi.encodePacked(r, s, v); + + op.signature = bytes.concat(op.signature, bytes6(uint48(pausedUntil)), sig); + } + + ops[0] = op; + logGas(op); + entryPoint.handleOps(ops, beneficiary); + assertEq(address(kernel.getDefaultValidator()), address(killSwitch)); + op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(Kernel.execute.selector, owner, 0, "", Operation.Call) + ); + + op.signature = bytes.concat(bytes4(0), entryPoint.signUserOpHash(vm, ownerKey, op)); + ops[0] = op; + vm.expectRevert(); + entryPoint.handleOps(ops, beneficiary); // should revert because kill switch is active + vm.warp(pausedUntil + 1); + entryPoint.handleOps(ops, beneficiary); // should not revert because pausedUntil has been passed + } + + function logGas(UserOperation memory op) internal returns (uint256 used) { + try this.consoleGasUsage(op) { + revert("should revert"); + } catch Error(string memory reason) { + used = abi.decode(bytes(reason), (uint256)); + console.log("validation gas usage :", used); + } + } + + function consoleGasUsage(UserOperation memory op) external { + uint256 gas = gasleft(); + vm.startPrank(address(entryPoint)); + kernel.validateUserOp(op, entryPoint.getUserOpHash(op), 0); + vm.stopPrank(); + revert(string(abi.encodePacked(gas - gasleft()))); + } +} + +// computes the hash of a permit +function getStructHash( + bytes4 sig, + uint48 validUntil, + uint48 validAfter, + address validator, + address executor, + bytes memory enableData +) pure returns (bytes32) { + return keccak256( + abi.encode( + keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), + bytes4(sig), + uint256(uint256(uint160(validator)) | (uint256(validAfter) << 160) | (uint256(validUntil) << (48 + 160))), + executor, + keccak256(enableData) + ) + ); +} + +// computes the hash of the fully encoded EIP-712 message for the domain, which can be used to recover the signer +function getTypedDataHash( + address sender, + bytes4 sig, + uint48 validUntil, + uint48 validAfter, + address validator, + address executor, + bytes memory enableData +) view returns (bytes32) { + return keccak256( + abi.encodePacked( + "\x19\x01", + _buildDomainSeparator("Kernel", "0.0.2", sender), + getStructHash(sig, validUntil, validAfter, validator, executor, enableData) + ) + ); +} + +function _buildDomainSeparator(string memory name, string memory version, address verifyingContract) + view + returns (bytes32) +{ + bytes32 hashedName = keccak256(bytes(name)); + bytes32 hashedVersion = keccak256(bytes(version)); + bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + + return keccak256(abi.encode(typeHash, hashedName, hashedVersion, block.chainid, address(verifyingContract))); +} From daae3e246f628645a0c52db48710f025ca723189 Mon Sep 17 00:00:00 2001 From: taek Date: Wed, 28 Jun 2023 16:12:16 +0900 Subject: [PATCH 05/33] udpated the killswitch action (#12) --- package.json | 2 +- src/executor/KillSwitchAction.sol | 23 +++++++++++++++++------ src/validator/KillSwitchValidator.sol | 3 +++ test/foundry/KillSwitch.t.sol | 4 ++-- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index fe428eb5..8019e21e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@zerodevapp/contracts", "description": "ZeroDev Account Abstraction (EIP 4337) contracts", "main": "./dist/index.js", - "version": "4.0.0-beta.13", + "version": "4.0.0-beta.14", "scripts": { "prepack": "./scripts/prepack-contracts-package.sh", "postpack": "./scripts/postpack-contracts-package.sh" diff --git a/src/executor/KillSwitchAction.sol b/src/executor/KillSwitchAction.sol index 6a0f455b..0d8a633d 100644 --- a/src/executor/KillSwitchAction.sol +++ b/src/executor/KillSwitchAction.sol @@ -1,10 +1,13 @@ +pragma solidity ^0.8.18; + import "src/validator/IValidator.sol"; +import "src/validator/KillSwitchValidator.sol"; import "src/abstract/KernelStorage.sol"; contract KillSwitchAction { - IKernelValidator public immutable killSwitchValidator; + KillSwitchValidator public immutable killSwitchValidator; - constructor(IKernelValidator _killswitchValidator) { + constructor(KillSwitchValidator _killswitchValidator) { killSwitchValidator = _killswitchValidator; } @@ -16,10 +19,18 @@ contract KillSwitchAction { } } - function activateKillSwitch() external { + function toggleKillSwitch() external { WalletKernelStorage storage ws = getKernelStorage(); - ws.defaultValidator = killSwitchValidator; - getKernelStorage().disabledMode = bytes4(0xffffffff); - getKernelStorage().lastDisabledTime = uint48(block.timestamp); + if(address(ws.defaultValidator) != address(killSwitchValidator)) { + // this means it is not activated + ws.defaultValidator = killSwitchValidator; + getKernelStorage().disabledMode = bytes4(0xffffffff); + getKernelStorage().lastDisabledTime = uint48(block.timestamp); + } else { + (address guardian, IKernelValidator prevValidator, , bytes4 prevDisableMode) = killSwitchValidator.killSwitchValidatorStorage(address(this)); + // this means it is activated + ws.defaultValidator = prevValidator; + getKernelStorage().disabledMode = prevDisableMode; + } } } diff --git a/src/validator/KillSwitchValidator.sol b/src/validator/KillSwitchValidator.sol index f72f3937..81280311 100644 --- a/src/validator/KillSwitchValidator.sol +++ b/src/validator/KillSwitchValidator.sol @@ -15,6 +15,7 @@ struct KillSwitchValidatorStorage { address guardian; IKernelValidator validator; uint48 pausedUntil; + bytes4 disableMode; } contract KillSwitchValidator is IKernelValidator { @@ -37,6 +38,7 @@ contract KillSwitchValidator is IKernelValidator { uint256 delayedData = _packValidationData(false, 0, pausedUntil); return _packValidationData(_intersectTimeRange(res, delayedData)); } + return SIG_VALIDATION_FAILED; } function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) @@ -64,6 +66,7 @@ contract KillSwitchValidator is IKernelValidator { // save data to this storage validatorStorage.pausedUntil = uint48(bytes6(_userOp.signature[0:6])); validatorStorage.validator = KernelStorage(msg.sender).getDefaultValidator(); + validatorStorage.disableMode = KernelStorage(msg.sender).getDisabledMode(); bytes32 hash = ECDSA.toEthSignedMessageHash(keccak256(bytes.concat(_userOp.signature[0:6],_userOpHash))); address recovered = ECDSA.recover(hash, _userOp.signature[6:]); if (validatorStorage.guardian != recovered) { diff --git a/test/foundry/KillSwitch.t.sol b/test/foundry/KillSwitch.t.sol index d285afce..eaf632b1 100644 --- a/test/foundry/KillSwitch.t.sol +++ b/test/foundry/KillSwitch.t.sol @@ -57,7 +57,7 @@ contract KernelExecutionTest is Test { op = entryPoint.fillUserOp( address(kernel), - abi.encodeWithSelector(KillSwitchAction.activateKillSwitch.selector) + abi.encodeWithSelector(KillSwitchAction.toggleKillSwitch.selector) ); address guardianKeyAddr; uint256 guardianKeyPriv; @@ -68,7 +68,7 @@ contract KernelExecutionTest is Test { { bytes32 digest = getTypedDataHash( address(kernel), - KillSwitchAction.activateKillSwitch.selector, + KillSwitchAction.toggleKillSwitch.selector, 0, 0, address(killSwitch), From ccc01a6705cdcfe1ed78834a6ff7b0cf36404d18 Mon Sep 17 00:00:00 2001 From: taek Date: Thu, 13 Jul 2023 00:23:23 +0900 Subject: [PATCH 06/33] fix: return value on temp kernel (#13) --- src/factory/TempKernel.sol | 30 ++++++++++++++++++++++++++---- src/test/TestERC721.sol | 4 ++++ test/foundry/Kernel.test.sol | 9 ++++++++- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/factory/TempKernel.sol b/src/factory/TempKernel.sol index e2fe92d1..5c106717 100644 --- a/src/factory/TempKernel.sol +++ b/src/factory/TempKernel.sol @@ -176,9 +176,29 @@ contract TempKernel is EIP712, IAccount { if (address(validator) != address(0)) { validator.enable(getStorage().validatorData); } - - (bool success, bytes memory ret) = _newImplementation.delegatecall(msg.data); - require(success, string(ret)); + + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), _newImplementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } } // WARTNING: this function is NOT VIEW @@ -223,6 +243,8 @@ contract TempKernel is EIP712, IAccount { ret := ptr success := result } - require(success, string(ret)); + if(!success) { + revert(string(ret)); + } } } diff --git a/src/test/TestERC721.sol b/src/test/TestERC721.sol index 2cc1aa8a..9733f5c3 100644 --- a/src/test/TestERC721.sol +++ b/src/test/TestERC721.sol @@ -9,4 +9,8 @@ contract TestERC721 is ERC721 { function mint(address _to, uint256 _id) external { _mint(_to, _id); } + + function safeMint(address _to, uint256 _id) external { + _safeMint(_to, _id); + } } diff --git a/test/foundry/Kernel.test.sol b/test/foundry/Kernel.test.sol index e0a931bd..c0fc84c7 100644 --- a/test/foundry/Kernel.test.sol +++ b/test/foundry/Kernel.test.sol @@ -2,13 +2,13 @@ pragma solidity ^0.8.0; import "src/factory/KernelFactory.sol"; -import "src/factory/TempKernel.sol"; import "src/factory/ECDSAKernelFactory.sol"; import "src/Kernel.sol"; import "src/validator/ECDSAValidator.sol"; import "src/factory/EIP1967Proxy.sol"; // test artifacts import "src/test/TestValidator.sol"; +import "src/test/TestERC721.sol"; // test utils import "forge-std/Test.sol"; import {ERC4337Utils} from "./ERC4337Utils.sol"; @@ -63,6 +63,13 @@ contract KernelTest is Test { assertEq(storage_.owner, owner); } + function test_erc721_receive() external { + Kernel kernel2 = Kernel(payable(address(ecdsaFactory.createAccount(owner, 1)))); + TestERC721 nft = new TestERC721(); + nft.safeMint(address(kernel2), 1); + assertEq(nft.ownerOf(1), address(kernel2)); + } + function test_validate_signature() external { Kernel kernel2 = Kernel(payable(address(ecdsaFactory.createAccount(owner, 1)))); bytes32 hash = keccak256(abi.encodePacked("hello world")); From 5654ca185cb9c050d3eec308cfe2005ac913dab3 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 13 Jul 2023 00:57:46 +0900 Subject: [PATCH 07/33] deploy script --- .../DeployKernel.s.sol/5/run-1689175760.json | 77 ++++++++++ .../DeployKernel.s.sol/5/run-1689175805.json | 107 ++++++++++++++ .../DeployKernel.s.sol/5/run-latest.json | 106 ++++--------- .../80001/run-1689175940.json | 74 ++++++++++ .../80001/run-1689175989.json | 74 ++++++++++ .../80001/run-1689176008.json | 75 ++++++++++ .../80001/run-1689176015.json | 139 ++++++++++++++++++ .../DeployKernel.s.sol/80001/run-latest.json | 123 +++++++++------- scripts/DeployKernel.s.sol | 12 +- 9 files changed, 653 insertions(+), 134 deletions(-) create mode 100644 broadcast/DeployKernel.s.sol/5/run-1689175760.json create mode 100644 broadcast/DeployKernel.s.sol/5/run-1689175805.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1689175940.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1689175989.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1689176008.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1689176015.json diff --git a/broadcast/DeployKernel.s.sol/5/run-1689175760.json b/broadcast/DeployKernel.s.sol/5/run-1689175760.json new file mode 100644 index 00000000..355b5e60 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1689175760.json @@ -0,0 +1,77 @@ +{ + "transactions": [ + { + "hash": "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3f", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x40", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", + "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70" + ], + "returns": {}, + "timestamp": 1689175760, + "chain": 5, + "multi": false, + "commit": "ccc01a6" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-1689175805.json b/broadcast/DeployKernel.s.sol/5/run-1689175805.json new file mode 100644 index 00000000..b4d53375 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1689175805.json @@ -0,0 +1,107 @@ +{ + "transactions": [ + { + "hash": "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3f", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x40", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", + "transactionIndex": "0x9", + "blockHash": "0x1951b20bed49d1d2b3ad84d56cc44a7c2fd8b619f41d98ffedfedea537c059f0", + "blockNumber": "0x8e6cb6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xb19848", + "gasUsed": "0x3f7777", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xbd2a328d" + }, + { + "transactionHash": "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70", + "transactionIndex": "0xa", + "blockHash": "0x1951b20bed49d1d2b3ad84d56cc44a7c2fd8b619f41d98ffedfedea537c059f0", + "blockNumber": "0x8e6cb6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xb57027", + "gasUsed": "0x3d7df", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xbd2a328d" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689175805, + "chain": 5, + "multi": false, + "commit": "ccc01a6" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-latest.json b/broadcast/DeployKernel.s.sol/5/run-latest.json index fbc5b055..b4d53375 100644 --- a/broadcast/DeployKernel.s.sol/5/run-latest.json +++ b/broadcast/DeployKernel.s.sol/5/run-latest.json @@ -1,7 +1,7 @@ { "transactions": [ { - "hash": "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", + "hash": "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", "transactionType": "CALL", "contractName": null, "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", @@ -11,33 +11,33 @@ "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x5cbf01", + "gas": "0x579d3c", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x3c", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3f", "accessList": [] }, "additionalContracts": [ { "transactionType": "CREATE2", - "address": "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39", - "initCode": "60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" }, { "transactionType": "CREATE", - "address": "0xcc9B83cc9aF4a79663EC9E326c67B0Fd27Afd7f7", - "initCode": "61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" }, { "transactionType": "CREATE", - "address": "0xC69eb9FFCDD53cF035a6e3bd5b73C22a43A5dF7A", - "initCode": "6101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" } ], "isFixedGasLimit": false }, { - "hash": "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", + "hash": "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70", "transactionType": "CALL", "contractName": null, "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", @@ -47,43 +47,17 @@ "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0xae7e3", + "gas": "0x54e89", "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", - "nonce": "0x3d", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x40", "accessList": [] }, "additionalContracts": [ { "transactionType": "CREATE2", - "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", - "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "function": null, - "arguments": null, - "transaction": { - "type": "0x02", - "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x59e62", - "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x3e", - "accessList": [] - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0xD49a72cb78C44c6bfbf0d471581B7635cF62E81e", - "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" } ], "isFixedGasLimit": false @@ -91,59 +65,43 @@ ], "receipts": [ { - "transactionHash": "0xef5ae980c7970c18929d2123a1a64d10e3f9b0babd39a8ca5f280951db7ec2b3", - "transactionIndex": "0x3", - "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", - "blockNumber": "0x8b821f", - "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x43f05a", - "gasUsed": "0x3f73a5", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2", - "effectiveGasPrice": "0xb2d06126" - }, - { - "transactionHash": "0x2854243115c66b09bd8751d1bb8007555b6666eae133138bc25ae52137f23946", - "transactionIndex": "0x4", - "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", - "blockNumber": "0x8b821f", + "transactionHash": "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", + "transactionIndex": "0x9", + "blockHash": "0x1951b20bed49d1d2b3ad84d56cc44a7c2fd8b619f41d98ffedfedea537c059f0", + "blockNumber": "0x8e6cb6", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x4bd62b", - "gasUsed": "0x7e5d1", + "cumulativeGasUsed": "0xb19848", + "gasUsed": "0x3f7777", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0xb2d06126" + "effectiveGasPrice": "0xbd2a328d" }, { - "transactionHash": "0xec326761775215f0bfc1a4f06ca926d530e03cfc02822a13f59be3105f810011", - "transactionIndex": "0x5", - "blockHash": "0xa412f8f63a552fba07848d39c2f8da6f6faed499e5042533f1f1e2d7e93a96ab", - "blockNumber": "0x8b821f", + "transactionHash": "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70", + "transactionIndex": "0xa", + "blockHash": "0x1951b20bed49d1d2b3ad84d56cc44a7c2fd8b619f41d98ffedfedea537c059f0", + "blockNumber": "0x8e6cb6", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x4fadfe", - "gasUsed": "0x3d7d3", + "cumulativeGasUsed": "0xb57027", + "gasUsed": "0x3d7df", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0xb2d06126" + "effectiveGasPrice": "0xbd2a328d" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1686212623, + "timestamp": 1689175805, "chain": 5, "multi": false, - "commit": "a119af4" + "commit": "ccc01a6" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1689175940.json b/broadcast/DeployKernel.s.sol/80001/run-1689175940.json new file mode 100644 index 00000000..e58f5c95 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1689175940.json @@ -0,0 +1,74 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x35", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x36", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689175940, + "chain": 80001, + "multi": false, + "commit": "ccc01a6" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1689175989.json b/broadcast/DeployKernel.s.sol/80001/run-1689175989.json new file mode 100644 index 00000000..fcf68112 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1689175989.json @@ -0,0 +1,74 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x35", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x36", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689175989, + "chain": 80001, + "multi": false, + "commit": "ccc01a6" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1689176008.json b/broadcast/DeployKernel.s.sol/80001/run-1689176008.json new file mode 100644 index 00000000..c4e17e99 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1689176008.json @@ -0,0 +1,75 @@ +{ + "transactions": [ + { + "hash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x35" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x36" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287" + ], + "returns": {}, + "timestamp": 1689176008, + "chain": 80001, + "multi": false, + "commit": "ccc01a6" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1689176015.json b/broadcast/DeployKernel.s.sol/80001/run-1689176015.json new file mode 100644 index 00000000..bec66f08 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1689176015.json @@ -0,0 +1,139 @@ +{ + "transactions": [ + { + "hash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x35" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x36" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "transactionIndex": "0x0", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x3f6e5d", + "gasUsed": "0x3f6e5d", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x0000000000000000000000000000000000000000000000000016272ed00b13000000000000000000000000000000000000000000000000000e6ae0a233f263160000000000000000000000000000000000000000000032fcd83473677dacbdc50000000000000000000000000000000000000000000000000e54b97363e750160000000000000000000000000000000000000000000032fcd84a9a964db7d0c5", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", + "transactionHash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f11" + }, + { + "transactionHash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", + "transactionIndex": "0x1", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x4345ec", + "gasUsed": "0x3d78f", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x00000000000000000000000000000000000000000000000000015780fdab41000000000000000000000000000000000000000000000000000e54b9735fb0fbe90000000000000000000000000000000000000000000032fcd84a9a964db7d0c50000000000000000000000000000000000000000000000000e5361f26205bae90000000000000000000000000000000000000000000032fcd84bf2174b6311c5", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", + "transactionHash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f11" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689176015, + "chain": 80001, + "multi": false, + "commit": "ccc01a6" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json index f2eb4914..bec66f08 100644 --- a/broadcast/DeployKernel.s.sol/80001/run-latest.json +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -1,46 +1,61 @@ { "transactions": [ { - "hash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", - "transactionType": "CREATE", - "contractName": "ERC721Actions", - "contractAddress": "0xFC3a1F6577A8bCf6ef23AA1024E07c3504824dd3", + "hash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", "function": null, "arguments": null, "transaction": { - "type": "0x02", + "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "gas": "0x22261", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", "value": "0x0", - "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", - "nonce": "0x2f", - "accessList": [] + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x35" }, - "additionalContracts": [], + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], "isFixedGasLimit": false }, { - "hash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", + "hash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", "transactionType": "CALL", "contractName": null, "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", "function": null, "arguments": null, "transaction": { - "type": "0x02", + "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0xea763", + "gas": "0x54e89", "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3", - "nonce": "0x30", - "accessList": [] + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x36" }, "additionalContracts": [ { "transactionType": "CREATE2", - "address": "0x842Ea41c15B32a8bcbDb17B5232b220e3B87082B", - "initCode": "608060405234801561001057600080fd5b50610b97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa578063b7b8d604146100f3575b600080fd5b61006f61006a366004610920565b6101b6565b005b61008461007f366004610962565b61035b565b6040519081526020015b60405180910390f35b6100846100a53660046109ae565b61039d565b61006f6100b8366004610920565b505033600090815260208190526040902080546001600160e01b031916815560010180546fffffffffffffffffffffffffffffffff19169055565b610160610101366004610a02565b600060208190529081526040902080546001909101546001600160a01b03821691600160a01b810460e090811b92600160c01b909204901b9065ffffffffffff80821691600160301b810490911690600160601b900463ffffffff1686565b604080516001600160a01b039790971687526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101c56014828486610a2b565b6101ce91610a55565b60601c905060006101e3601860148587610a2b565b6101ec91610a8a565b905060006101fe601c60188688610a2b565b61020791610a8a565b905060006102196022601c8789610a2b565b61022291610ab8565b60d01c9050600061023760286022888a610a2b565b61024091610ab8565b60d01c90506000610255602c6028898b610a2b565b61025e91610a8a565b6040805160c0810182526001600160a01b0398891681526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081523360009081529a8b9052939099209151825498519151851c600160c01b0263ffffffff60c01b199290951c600160a01b026001600160c01b03199099169a169990991796909617979097161784555051600190920180549351945163ffffffff16600160601b0263ffffffff60601b19958316600160301b026bffffffffffffffffffffffff19909516939092169290921792909217929092161790555050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103f7846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006104478261040d610140890189610ae6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066492505050565b90506000808061045a60208a018a610a02565b6001600160a01b03908116825260208201929092526040016000208054909250838216911614610490576001935050505061065d565b8054600160a01b900460e01b6001600160e01b0319166104b36060890189610ae6565b6104c291600491600091610a2b565b6104cb91610a8a565b6001600160e01b0319161461051b5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610394565b600061052a6060890189610ae6565b6001840154600160601b900463ffffffff1690610548826014610b2d565b63ffffffff169261055b93929190610a2b565b61056491610a55565b82546040516301ffc9a760e01b8152600160c01b90910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190610b5f565b61062d5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610394565b506001015460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60008060006106738585610688565b91509150610680816106cd565b509392505050565b60008082516041036106be5760208301516040840151606085015160001a6106b28782858561081a565b945094505050506106c6565b506000905060025b9250929050565b60008160048111156106e1576106e1610b81565b036106e95750565b60018160048111156106fd576106fd610b81565b0361074a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610394565b600281600481111561075e5761075e610b81565b036107ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610394565b60038160048111156107bf576107bf610b81565b036108175760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610394565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561085157506000905060036108d5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ce576000600192509250506108d5565b9150600090505b94509492505050565b60008083601f8401126108f057600080fd5b50813567ffffffffffffffff81111561090857600080fd5b6020830191508360208285010111156106c657600080fd5b6000806020838503121561093357600080fd5b823567ffffffffffffffff81111561094a57600080fd5b610956858286016108de565b90969095509350505050565b60008060006040848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a1868287016108de565b9497909650939450505050565b6000806000606084860312156109c357600080fd5b833567ffffffffffffffff8111156109da57600080fd5b840161016081870312156109ed57600080fd5b95602085013595506040909401359392505050565b600060208284031215610a1457600080fd5b81356001600160a01b038116811461065d57600080fd5b60008085851115610a3b57600080fd5b83861115610a4857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610a825780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610a825760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610a825760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610afd57600080fd5b83018035915067ffffffffffffffff821115610b1857600080fd5b6020019150368190038213156106c657600080fd5b63ffffffff818116838216019080821115610b5857634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610b7157600080fd5b8151801515811461065d57600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000fc3a1f6577a8bcf6ef23aa1024e07c3504824dd3" + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" } ], "isFixedGasLimit": false @@ -48,15 +63,15 @@ ], "receipts": [ { - "transactionHash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", - "transactionIndex": "0xa", - "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", - "blockNumber": "0x229a8af", + "transactionHash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "transactionIndex": "0x0", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": null, - "cumulativeGasUsed": "0x2361ed", - "gasUsed": "0x1a44b", - "contractAddress": "0xFC3a1F6577A8bCf6ef23AA1024E07c3504824dd3", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x3f6e5d", + "gasUsed": "0x3f6e5d", + "contractAddress": null, "logs": [ { "address": "0x0000000000000000000000000000000000001010", @@ -64,31 +79,31 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" ], - "data": "0x0000000000000000000000000000000000000000000000000000c3b6d36817500000000000000000000000000000000000000000000000000e7a003f14396a6c000000000000000000000000000000000000000000000a090f05abee315aabe40000000000000000000000000000000000000000000000000e793c8840d1531c000000000000000000000000000000000000000000000a090f066fa504c2c334", - "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", - "blockNumber": "0x229a8af", - "transactionHash": "0xcca90b6aaeffb15645ebc414b1ad5adc180277f11a308b6edfbb66b6e29aa67f", - "transactionIndex": "0xa", - "logIndex": "0x33", + "data": "0x0000000000000000000000000000000000000000000000000016272ed00b13000000000000000000000000000000000000000000000000000e6ae0a233f263160000000000000000000000000000000000000000000032fcd83473677dacbdc50000000000000000000000000000000000000000000000000e54b97363e750160000000000000000000000000000000000000000000032fcd84a9a964db7d0c5", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", + "transactionHash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "transactionIndex": "0x0", + "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "type": "0x2", - "effectiveGasPrice": "0x77359400" + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f11" }, { - "transactionHash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", - "transactionIndex": "0xb", - "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", - "blockNumber": "0x229a8af", + "transactionHash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", + "transactionIndex": "0x1", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x2dfddd", - "gasUsed": "0xa9bf0", + "cumulativeGasUsed": "0x4345ec", + "gasUsed": "0x3d78f", "contractAddress": null, "logs": [ { @@ -97,28 +112,28 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" ], - "data": "0x0000000000000000000000000000000000000000000000000004f0b4fa2d01000000000000000000000000000000000000000000000000000e793c8840b70e6c000000000000000000000000000000000000000000000a090f066fa504c2c3340000000000000000000000000000000000000000000000000e744bd3468a0d6c000000000000000000000000000000000000000000000a090f0b6059feefc434", - "blockHash": "0xa6fd229004f855f5e9a48f15f32d29354f2959399c23af0c8a3371518779658d", - "blockNumber": "0x229a8af", - "transactionHash": "0xee230f7e37becc731e583b52f54a11f8c629b17700ba48067ec3ba64e1a127d5", - "transactionIndex": "0xb", - "logIndex": "0x34", + "data": "0x00000000000000000000000000000000000000000000000000015780fdab41000000000000000000000000000000000000000000000000000e54b9735fb0fbe90000000000000000000000000000000000000000000032fcd84a9a964db7d0c50000000000000000000000000000000000000000000000000e5361f26205bae90000000000000000000000000000000000000000000032fcd84bf2174b6311c5", + "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", + "blockNumber": "0x2419989", + "transactionHash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", + "transactionIndex": "0x1", + "logIndex": "0x1", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "type": "0x2", - "effectiveGasPrice": "0x77359400" + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f11" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1685566229, + "timestamp": 1689176015, "chain": 80001, "multi": false, - "commit": "55649c1" + "commit": "ccc01a6" } \ No newline at end of file diff --git a/scripts/DeployKernel.s.sol b/scripts/DeployKernel.s.sol index 30ba81a2..6937a167 100644 --- a/scripts/DeployKernel.s.sol +++ b/scripts/DeployKernel.s.sol @@ -19,14 +19,14 @@ contract DeployKernel is Script { address kernelFactory = address(bytes20(returnData)); console.log("KernelFactory deployed at: %s", kernelFactory); - bytecode = type(ECDSAValidator).creationCode; - (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode)); - require(success, "Failed to deploy ECDSAValidator"); - address validator = address(bytes20(returnData)); - console.log("ECDSAValidator deployed at: %s", validator); + //bytecode = type(ECDSAValidator).creationCode; + //(success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode)); + //require(success, "Failed to deploy ECDSAValidator"); + //address validator = address(bytes20(returnData)); + //console.log("ECDSAValidator deployed at: %s", validator); bytecode = type(ECDSAKernelFactory).creationCode; - (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(kernelFactory), abi.encode(validator), abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); + (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(kernelFactory), abi.encode(address(0x180D6465F921C7E0DEA0040107D342c87455fFF5)), abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); require(success, "Failed to deploy ECDSAKernelFactory"); address ecdsaFactory = address(bytes20(returnData)); console.log("ECDSAKernelFactory deployed at: %s", ecdsaFactory); From 8f0f478f957d905be934ed725b5d0c7b16140ad0 Mon Sep 17 00:00:00 2001 From: Derek Chiang Date: Thu, 13 Jul 2023 20:32:29 +0800 Subject: [PATCH 08/33] Update audit report to include session keys --- audits/kalos_v1.pdf | Bin 1806108 -> 1993487 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/audits/kalos_v1.pdf b/audits/kalos_v1.pdf index 3f16c5723c476acc7d8940225fe298ebf02f9670..a437ef76366e7ae9be67fdad5dc2ec525f1d193e 100644 GIT binary patch delta 188941 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
ZVcT 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

S;+|BWGvnAeN_bB5yHNM0*Mciz!Yp1&rhsCQbm) zHZl}w=@q*ip#jS@*(@w!s0%ti?mM5ZDiTxriVdB&LxFbOFGP zKN*xs5DY{bN5T=aB1&B;{Onni3WR6g(&!t ze}fXp^kogMKs`0Ob<`I$O3kOqhZ7L}8^IcG6mHbIIvQ^NGC(>&jp+Q)x!JbHbWQFu z0DCRV>t=T^Q?pLrryIta6b*LYY0wF`I>$Z0UC>Ru@+_ObW)M=`3VkUz{E##CeC+Rl zlQvh$Mz~WPd?Ps(40@bS>@nx4^MX%Tu*;u5oGyt z5+|&>&oP(v6?C1buHUWhX!E~R7Z~P2_%fkJWN{bWn1qO{>~r`sq_;rMn?dWTYXarF zIrtP7HZrdd9neaim@SjW9cREW5!DXgA{&CPqbJI>ZNm;$4NkLo4z-3 znA&6ide0+k`>mi#_0y;imO>7HUz?ji^eeCL?^nl^K>rA706jsm{frIyP+B$m@F}#; zw0@#<*$)|8490A-_#M4gr`8(TZxO6DY`P?+IW+?u2JXfND5H z>>14p6ME=!hM4#17bJkOf#sW>&+y|Gu01K1D{~ka2QK}}=tVo@&uUn4#}!jFHHmpR z8Zdf|zK3)*K4LVKVIQp5UJuHdQAM)J_-M$bhGpTxAL9so2&n}z5}=ql)qaO=D8VTV z#plA&-cJ<;j3XGvtOMBkl^w+}nD7G*t|FYtLe3$CDgC?OCL+bGg|{^U*;ARojaJ#X zzI4b1UVen#v4>Sr9HSAt9xMJBxIc!ZRxVic0CY)P1$`VmoEbw7#c@s^>_Qf+g(k8^ z?$}?CRXS4;tK?nn*Lg)!ZS*(#ZC9$+wp^A^+S9HxfNL6q@Xwi?b670xk#OSav~jz*(lHypS${A z(~!U6z)5Wu%N4McT3=h8fm8aH>z823%y(GyI{_E=XL z$WX3ziiGOfhK415!vVx9zs)1ffbC#~kwN&XTMTlma!^&*1B_p>J+&S-ACGv~6A`iyja!sMeA~wo!VoFB-CXweN>1ZCZ@acMq z(eGi;gXYF#V=Q=`SVj>r=It4Pw`dL zBoffX=&X_nt>uS-nbNRzpV>?#a;IlxkCdE!+bwm3I!RrM$eV)Hb)mD?3Ow0SQEM$F zKYY7re5!R~swxhLY_=uvIDl0tN)USAHaP%q_mcpGxZUrI-QCZ>haNv~tH&0*fS<5D zgP!;E`^Wn(R1yj!JORHq+IC$+^?IvwDXoOIgJWAqCEvy#PK6Cx>vf-wmOs1_=p*~E zgO2#TvT8T=XZ@PZg;kUW@ol+lhh1&dt%M$a+ID|I(5;AZZq>DB#wf7OK*h0Umy2u! zH{k%>7VAIs-F*vdQQFqFJs>$|dCcRF`aVxjsUow)?>FJc?Zle(!3(Nl^f*Zn1y4k> z=TpQIk=LKxs~ZF2q?1oXN@bNqXv>Nk6X2=nVW@Z*AvGFRi6f(E%orfujYR7M!ch~R zjZ4{f#|LA^mmx4hTIFmFG}5X07#JGSb)tZlWHI^?$yTf&3${`#Lf?r7VhUE&Rb%wN zs-gn&S4Hs5<&4vlN!I3Q{tUPTh?2KSLzw`&aruM7b#WK2< z@9whi$fA2Z-N4s6<#O6!9TRw{Qa;;!EEg`!HMh56V-rP5jNlq&9r$x7+OG|v6Fdu!HDexq;18N)u5k|=gg2GiTtVzb)r^% zIyQH9msk$Q({(XL)rT?^k^L_^Y17_C$IUguQ6hL$_eoXxp^}4v_-Nr8V#~o0BQxmP zr(7s=nG!|DiUt*$`ahO=A32#dpt=^-q=h;_FTc&)C_fesQr$lt-kPq8Tsi>5KZ_JO z@(4BYCgqECM=3=KTx!qK`icmq6K6-G`7|B+D#YVo-Iw>2vwBl3kp(wkQj~$Vbz_C} z%8BxIg6@+hH?3X7Mk#;H{8=1s81aoQ$W*Uy9oZ5mK|$%l&<#NV57`0MS6-$KjCY#Y zWsWg2wpx0dj=6KI<)~|}B{Tr7;-j{cdb&~dC_ffd-$2$SYFH%)t5JnQ=wBrE@t^9< zO4OSZRkvU+WhK6}7%}c38DCZ9<7R`KKErQA>IXh+n+kCyDJR$6@l}7urI-7jOL+}x zZOGYFam}FA=d$rbHtn*-Y^67tI!YB>+h!Wb}xaen+-nht4^|Ir?4?=>NicrE@(=Z)@3eu)&)zdXY!nHYRvnG#DGd$BC zu-9qMfwRO0hj>}wk*)uc!&pI&v(f$4=I*Gy^c7G5-DB@9uYhSOgC6>`akg)~+~JM~ zK89_+zb^c{1P>N(ERX;+e4w#LcrGF3;RiFxMAS;&N%TeaT-RXfwZ=A0^VzogPUxo$ zDesn2DDy2Z-PP+%zX%vMQUv=8m;R+!9r$YHf>3{>1~Q}3gW=&#yD9GgQ`0TVE2LT) z>+!Pkxtfj{+hxuL9%L)pm$ILvq_K>IZ)HzJrf%X)Yi)C)yV-J7O8SX8~Hrx&R zIXpwPIHEp$LW@#3M>Z+Gy=$;C_b*4?Eu;j*{0-`Dsn7rm&oL-nqAuqxGg%E`p6q#f z9+s_(i*_YkQQY$)mvyT7FK=B9o8$c;K^;b9My+w_Pq}Xqui?_zUjTwTef|U4thY;F z(TNW~RDR5yyJix9Q44|+wG*usVrtc`1UEgC2pf; z)EX3!bGR$*C#joy?RUy&*!2;E&b*jeUhj$TL+{SH*}MonK2#ih?I|7OTvC@oQtZ_x z<8apZ{>P^+JsGsP>x&j}ZgV;I*#eU|{cX5PJDtb#crMyAyk*nBZx(^Q96Y=AIeYA0 z@)^QGO0%0gJG)%Pw&r648w5=ltpQD=&nb0tWwD%gyOMpa4{ZPE=Afex$9hrxwAaso<>v<4#7e*}ssagux9%ErqL>&O2 z7cGmMS++C-8Hn?y>5s5pk@@A|qpHoowc+mLpYkU=s0Im-#!J;wpNiF^XaWvC6`VRGNQ%iHx;%MOm!?3Ib%WVMAA zqFoa)UTg}4omy}@jh+K9&C*e)<@&)vfs&lA4;lPs(-9Y=J6F^_Gw}D?98uzZxmWC( zzQQ}-Nh^jV3+4#Y$l%?tH+cE1>>Sqj;GXrOr+I~}N#Whk5U6FOkrhBji$jWG_+fBH z6ZjQ+s?^(SiQ9>5p zBlo&WQNy@OusOd4wnl)+^28=o_=^5f9n`89nEicAx=vkt3}W4AQ?@eg#sI@U|ML`h zjWvZ{l*&SQsp`82t z92}bR-lN6*pxbdQa+dCH%7}>Jv3)u;27V)e;PsZgTF(JW zFtM@yZ&UHH?xy`w8euJhMIut07?W|{B5^Q`I#X4A^ZJ_Np!B{^1_IYZg zs*UYvR*uZ9rfvQ8u!@+p>;3Cj#BBmu_V@kbU@t-T$o}~!1N}nz_xIpS>79VU&+F~> z%kTF)0R%VQsO)gyf5ZU5<{$z>?&=7LnCiIFZa zokm02;ysG%Dn_lBBw^m zk}L+B9SYrfa!{~iIyFqV74;o_h3HX3Vi+9)%tiNu6zM&mtB5mT2Se^}+m)|7zsMwx zDS{V?l`9om~N;n>SLLOhlcFTm4=)*=tC6AjU+Y3)>+L`c1(QsEe>2)lCL& ztLeSd=+T6HQ`u!6@9V*k5B=A;lS)L;$4xG;MVgs&82oAYq2T{v>n&g^i`6dB!QCAO zcXxMpXK?qy-QfU(ySqDsySux)ySw{i?!C$TU-FXXWH(v6yIpNh+OPfAH~L0y206z1 ztNyS^;U`Z>J+`XKPb-;RWIsT%3#Ez{ng#bHB8`l`rit{;(h1Duacl+MOL!j2BPEnG z?~4Qd^GzQ{_tbMX48Ob{ey1nlacoTaY1P~kKAyQQ7BZbDQUtNWSrsx?gd>M{g`*D< z!T_rOKd$-czs2q|Dk@UAJ@#+WWl zy$iV!lp_S0BG{3NGkgRxet(PtUd6wQB|Jc#?qpx+2R$MXipp(SxPEtz%tATilKx2? z9X-JZ7Qg`RW%naLd!?F89u#bz^DUnLc0lHBu|#c}d;3p*ivC;YrddyJz;SW**x5>M z5t?cqA9;en=Zf0Ln>fJEubjK~kx6Ii#%%V+?C%+H zMdcR-cS^hN@>cc;q%3niHP;|jmkfWGOwF76hw1#QS7tW1A8LE+Pvqa(pJta6VA%*M zcEO!x;rx+SOuM+kf9f{qH&eK8=bS%>OZ)!%{z{5-0UbzMrHlr&XSmPdvJfNZDRG(q z<~KeH-A^FJ`*8MRy`Dn@cA5#EJIMFAd`QG;0z-tOThQ|$oxx)8VNzA1G4&6`EsyZO zNv6itxP!igiRHM=QqKwsEu&X9_L`dd`*VSq&hUYjh8x^1O^SI)<(Y{A8&l&)NO)f$ zxHlg7w&D+|P`V{RpNJ6ec5=a|FAsM8fjbeBl5tmaA8OyC1RFRBc7JH&L42K%ij){M zXFTMb3?)?nZL*)ePSr^kr`Sd=^(W5+8s=_dpl{vJ{t{RxgJKTZUkQX_mvv}jq)AeJ z!P+*zNs@tf>hvI$ih!U3iFM3F#|KekiwdcB|YrN(n8)XZX{!PF$+9$SQlMg3gDua+j;r3KGjDf*|@K_!uD68rm@? z(y#gJjkq3=#}6tOy+g!v?vP$v3drlgK1FnFc5 z7}mU7|L%SQ*ae!TC6#dB8)&YFG4snM;{K+|q6gVA$%{?dCQU9qUXf5OSoB5nWrNd@ z`Bii8PCy6lv_s@1CM!$u9TlOI#2mnm$f;Jz&22(K1yur5s5VHBxcXyA6=Nyn99w%4 zK$f(~v(l|*N+6vM= zWs6{9#7MEigxqX{!#KB<^W$^GJ_V6*<2awVc94rxXqK!C7a1WKJOO--V7*Kzp)yUY zlo3uVU?hnx+5rnV50c^#M`k&MjReJFgr7b(v}Dm?Ya8U~fFkd5GQ%d*h`2x|Jp1<# zVBo=vN9MV>KRDu>VA5pQ5s)zGRjVtmqq!YAyA z^tg&gAB@Lq>moFtSY?1esY6&bOOe%>F4Ho&X~@3YP65xZl|*LmEn#mQzCq;Dl$YZ@1~7+>}wyMfYZQ;aJ47xT;z z0P5~7Fhi$uN))l0XZvS;H5>xQze%e>-1coi**(ilV<6AqLAdp%D4%&#bAm6bF`=j? zlTgyaEy=OKE7No5`y-#Yn}0uK75HL68?}ozThk;?;o3lxT$eT|r2M}0Iku&v<$cm8 zEEZMj3xHTmW7-hhHl0ar;lFX3aZ$za2S~txRQD8i{7l#MsW0LRI}Q})ZSIA;(2~0J zYi@X)KsBW5y%$z4)_HD~a_8+ns0*ijCYFuVwZ;Z{hN@|oclPMs;%c<@Zz;Revqd;O zM{Hy<7mKf0ot&-S0Xm#@L1ie~m-vN4=g6Pd#V@*&c1$B3;GmFVXgSi@+|mWg3s8Vf z>%euSViw}2MbHxGoL?V_OfahZjSlmn-uNSf3&|SDq)nH}*^wWStF=GSqeK=ccoQ_K z;(f@N`SDuQ;oQ;2IgIZ|9E0F1*Nw}XJ(3L`DQkDI&XcpM>Y~T`Jo{Y4Nj>klnuRzP z&_c>uW&U{oZ_|#p8aV_<=?bAgwg7ABc0uJ@yc8KfO@%vWjMFxoziW1G)vWkdl(m=Oy=5Bis;z#QV;lmFD-iS`4eiHsdNrs#duBhj2gXNh7QU5n`(cyIUa0CH&3$6iCvkk%&Zc{r7;e(< zMXd9%u&VbDiC%!@0`$EdPyr5(o`d}*t{7w+9o}HI(_~~kt4@{#C+DNnM77DG_Lr@p z54rl4Uy9#8BIgn&s7S1+5`iiOVGyp7q<*26exq{rX zi1B_>MjB}RU({~iKxA)OXVy5R_$4Z)0K$>LB(RaW@{|&&-?4LL#ADjgsKIpP}+_%C{27zn{7)5Cg(iR8$@VUbOB5A3I(S zaN$M0_9Hcra_UmFrcAv8A~h=XQ{sHCiFIAA#&y-IKMSN9oO}cJ-m2z>cTr2ec5}|p zTvTFjx*L%#q7TfRj}`_JxsxlFprGEU5cRlP9|ojG8xULnikzj6m3M0I#vdKg3xh{{ zDH7f}i6ch|(g9`|I;KFnH5B`4PGPd{NI@S0=|y!?Dg-G(i$pW;IjB4MJ~J?)9r$EH z0)cOKb0s^iOKs1H$LhI_PX3tcy1Qk#8Q3&}k8{Vd+TqNmw~OuLr*jAF?ul>}-L1+dUvH z)_e3fi?jdTYjz8|O*&7gve4u0?=G|MVci(gSjk{2=#tIDl*r?xJB7}am@jr9t;hnp z3XL)HuF*g2grx*3udIDi>7mPhk&k~NHBsu~DzC8*E-d26PEwn+yTnx<$!ofYwuN4Q z%EH`7EdUI+ZbVB!7P8651mv7#Aes2;j4{j>Lt4@oo)TRy}ved<6pWr z>zNVYTp*YFqaSOyFIpWy!@)2bUWSpSl&1I8?;Oqf_h`qOWzP~3;~fq|oF04Y+NBc- zb2E8oQ1$MzjUT0Z?g#+q^aV3K5bpdx8Kh+OOI*0*5HvibM&W;#wr zCUy=2Mph;|HYQGv?=W^i!m#$hOicgP6lZ1QWdFbWoeLd}s)J^GpRTT5obpqc*8LlG9^U$&=$v8_!lVk9bXE>+;tyX(YO|&o}tv zWb=swc7V_G76jV*wbN@RUT@&nTUEB+;I~}c6GFC6RPxr>7DyKYU_|!^tnTM)TQENU zXT0WiF&*bYv!cn*u9t%@y-$aQW^ptjhe16V5j3NFKW=483r|WwVN?^sl8D z&wSuKU;&hL8cz@^vTF*7fhr zOjjY&83@c2i3*u7ATkcKlsBGV7Wx{`q*XwNEPWiTz1LVfBo6jaSCQEp=we6L&sccN zXnl?v)TGDKv02SY^+bPyP8TV`aj|%>!%&5f#KJ(lYLPM<@#98UvUle0$J$JpG*#Y= z+j^Rl3U*u{ZwI&vhG39BT-|UY#%h3Oe$( zwUa&^#0m~r-b>5KCCs8(XLK+>Cx!eSt(qx1aI^b7oZBd47Xj;fe=5`%u;(YIK{<`< zU$p6NBJ5NIhYy6hS`WeJfmaJo+_*#RCm{XaiW`Z7-Jg>i?9i*n)iS@uL1=+Ss1Na% zO!OI5dwHgraKY`Ty_F7)Up+{yn^lg5kizP##D+0IMb;?QFzyLGjjY;BdjEI_ACYqp zAKf8~kKfCKn0{E5;l0`G^9HDhCOWcjraL%%whuu_luw-{d20R8RX~_UL3i(4mCN%b zYc{b7pDz3Bxtmw~3hK|vJ8fn1n`qaTLhh=yf9#4vRON?9j|^>W~~uKiY{b#)zudWkE-;QFl2rCoHU5{>jjEh=vJMlDxRSoeW{r>> z9BKAwCQcZDLjQnN+u3c)Au8%Q+5d4ALIG_8#PnjyVkE7KWIgM1I2NFRF5++-?$Le5v3(2HXK4VlT|p zF-{}yQ?aD}=jd)y+xsoNs6ycxtW)?1O- zd5<|M*oj`6jJE3H{Ug`or*yD$_rw|>bAX3?&_3COMl>qK5-*2_yeTlsC?SK(_eQIH z1jTo)DK__HlH>HpO7cXFLy`!WqKzV0iO1@DM$ZE$4Igo)7}1gtJCc=C~?(dS+jr3Q=ds-BEduCcyDt8nTX7vU56YYg$6kPZz``1pehE76z5t{5x& za+uVIu`n=gn?#8|9n^w4{)56o3fd1b)zu&#)n)`4qN`ksoCPeVOM-8@j%YL>7l#uMj%HW6SQZ^0)jit4B=5rzTRkB{_%>8L?6!Qw^z2Kda}~((lK3(_-)|;zln+a5RcWm{>jB6CG8O$qHqFt z1ErZ}?09?qD#d*tUy7arC=OmN|Iq;gKK0H0$=6N#L zOKR(IHZM1;TfS6)v2vj@3Rp11klxs?GrPb=kc{Hxt{uF8%W$9I>uy>7E9Wcnz4Ygx z)o_DyZDpl`OcbzRjhyOn!~~l)JJ&`WKTI!@d6>F+&!i)0ikqj7vJ>YH5>{OjJFvQP zI8h$?R?)#(Bd%zceuR5)u3Al27+hq~y5E*5dv2yaTjdyVv>*wlHsK|MK=pjg%=?sOw+5+H*8fweX`ekiE0IevKe;(r#$-G$T^U3xU|(UJCTQqX$#2* zMDGdN%xECigBG#^>_>F*mte3_Xd5yP6H2F_zSXqx=pQ$DLE)k|m3I~wV0ktr9>o>w z{>@{nyAzxkCN%wFlrKM+VWa-6xSvB|=ka0tM9%3!5dIQN;HhfGfgN$=GNgHKZqbse za(}7;^sTb2`y>rab6o|)&ZFKFi`lhza2foKFwa;d_9F45z(^(qzt_rNLPTQ?#6R_j z6w}465X{{8JoIv`l&R4?xJESQST_+dF^mu=3o~X7HIfA#g=0dZ5O=9bBl;3qhrjLl zU92-Pd?XvkQX9W!)!F5j-yga;$k3El2Q&H(pbm>I3P_Jn@gkvdE4QO!CXr1EkxE9Z zC3?*Z;D!9-z^GJJ=*VkN`M+fv8NoSAv(u~ijsW>}QQq3xc z=l$0LwtD=*?B~Y&;HgL-nybL=KYbTI;KD6Ed-;3=3N*=10(^68Y+BrD=L9n{6Z*YV z=>qi^Ln}KXQunwYJSLSb-a1k5SJ-7$AaHtJ-_RJhdi5yyt<^*FI$XVGtzC$BDCHxZ!FmHF=x$BrehECH!fUvS4SB$RAAPw}*S6~;;8kSH3(|(+ki=-0;RV-YW zkrtT1%2B^e2G^Jn8vN&ewd|>Yxj5KuA#%E+Wh7;Y7XBlvJx+wJrkg9-tz-w&+Enfw z*G|rTNMYEXMp>hAVNzo*W^4G%9ByMxW$>(bcAahx+Kk#r3OeIxAxKri1O1OhpEJ{%WS{ zkUCLP+rf17RCddN%z@7Ju@~No$SHbk2|LYOul_p}UG*fn5XeBjfHYm3r0SGJ@fUFbzN1Y1b%MNs| z>%B%GWwUjP9IgV_HxK5zJWS+E1V}zOMOCyyUg;pqKrKDgU0i+@MNqY{iJ!suJoA}T zSmr94+?8N2{$@W)vMIi2Axh)s``O`bF!+uKqvgv`nQ#AZ=2B(fhm-uvb!d9c;Y*Y( zlxMfLE$b)!c3wJQxTLA*3qt^UqO<`w+{a9=!W*P$$nOMVlH`$K;sFjBzbj{1bnmn? z^gFN%bA#?Q1^(*p0_-*RUKldY1{szlrsIPgqXKc zVSdze6lb6K`_3z8Ws3?;qnE6|WtX~KfUa}a(`x?grbq{^MCXApdT8>iz)qkK3g)<( z$-CQFlV$~0$xw0oW-i&t<{j>K0;>1 zrG8@!oJVRN{Sr|~FmXNMn11o#*7#ifB}{0~2_Y*Xe*fT;357!5e_nC?Rp7T~##I26 z1mzK+$Vsl?ks^5!#}m#A8SA1El->lb2k{L@K(t;Fulvc(xgDu3`;6KadV7*xDzLlw zvI^H&Wd^IP$yLFY1ypvZg#XeUx|L`3E49wHA?_ZU{@u|9ZPhD9&J|;0U9Sk=qgxZ; zPI{x}{;Su(cChXWQ@Eo1scR7zS{Ql9(xe$428E^2_vfmGXlnnU*)rYrkO& zeDtwUzuaTr*oQ;|*e;=cB@%q1wCw^Rd*1@9LK#j=*W%-e3B4%gn3p>ruFY&PIvu-Y z*|v4VX+8l^%VC-NsEw-=HzHgAU*$J|rT#_b>jJPWW`>Ya^uqNjE~6%8bVQx+6<=Kg zw$Bi~()K9YX3FZZHELq9(uOsKhBt^M~B%9ffExrlQ2jK;fjcj7oksQWP-1nt(9TXAJBlO2vwD-siMY?69T z$4^(wM}MY(myma9A4MQf{hr&rwDY%EOi+u_AwxY?(TN*^rJB2pQy){OWaE)Ut}sq* z>{Lh5#ktOkvOfSf6Ch&RJnJsSUWrj|+Dy3K9N>_DTN{l`7K)6dCz5;B2}Kw^U4%{s zc1oT2Cs}tKqxG?PLdjdcDz5?1&|mRuZJFo*I~71GWf+ksU!OZ}r6C{)Ma;DJ(Qdex^T{Bf>^P1Z(46!KY6O>ji8M)9dN zPP*(^r#z{QUptF~V&X|PV|2&;%r2`qTf8V0jc{OkJ(5dW&H2v;_N*P7S%ruyev;5SC!zh)alFYeR z6PL&5^ewZXnCI}oa*phLuAk+|>VX=x1HwuSMv7gv<*r_?8 zCVZ^9_I4G=X`j12-T^GDZCXAnqAJ=3Q7N0KkzN4g)e0JhL|w6VmCfL8WtUOk8#D8Y zku6gzppRhWtTqnd-($;JjU0hRz9$7$=;vVEM_ySZHAfp-RqEA|Voo5)(NKYdMtm=P zPt5H<+yR#=F!+UjW09rFywNPuUEqd?XU|m<8!fIlSz$C?%3*I@3zROwg6{Yl@&aQ! zgVpw2>J^q6V7&4o~;|_PxZH~7Y8MP4M}4FiZ@^UNOJi&KWM@uYR_ASuytZZZ@-mr(I$CclSX8Sn>VaNkq7~l zI)6)m2f37d`ZwE|Qvkp#Acq}sZxACcWqrRNM2zV&s>muQEAq%hUs*(hG_C zTc_NSx56lXPUWEme_G^F#6``Ycu|8q?HYVe_r)w;>fD~sCu%=#Zg01QyS{$p!}aO> zvv?=7_CO;h*9}Ae$4wm;n2GiO`l;h!z`!P-bAd`WWmCX>8@-p!e!?cdSHa=|IR3BA zx=>9vdYuin<4x^Yn?UnMxBwIts8*8gs2-&LsUAv!gf{IHkTX@={y14~+8$!YU=&jH zGAtg88W=D|-7BvMpWP|@B{$=!rSnxIVet8WOGv}M)g|MKPvZ4rn|7efidYkH1(3@w zj&}Pa=~R_UYaRuVtk{;dz~h7%RU}QNoQVE@s9v{%yp*5Y0D(dj z`K`v`on`JkR-M5?3eVV3X3D6xW0$t|5~ftHJ3^E33CUlafu|chr#ENSl0w>}g$|TR z<_7TpgC88zA)?6XzYP4l{^ge3_oxe=R@~9oPLqJ75>5z^nopGAG>~*}jbg4MZ=8q+ z_TmHPy+CGpuQ~r5W^HNvH>9Re+nTvYCnkgQO5k7~w3;IENFOi8`~)vek&@DuYQ6$f z?Jvx<=r#^5u@Z$lO$Ml>LwXX+KG;k}p!O*?ap*aGtMm}j=FF68D%-us7FYt5{%A{A z^m{}E^X?=-b-UXd@k)$f^oPhKuP37Yoc3gC$Ncty;(2C7p5KO3w*>Fu?@~rJSM$yL zdgZENp1)ZiY>*2`txmAGHMv1G@f$(KKAHDspksKBb~+)hI zkYi~l5a!1xj%%vUB$g8phFmfW_L~oyeX+{+@({Ivw&GJ#IB|AMF?q>v8I_(se@3Z5 zD~O&JaflL-QR*;Yg~~sz?9A-vVlH zaS)XM-rLVTs^h1Dr!(-4SofWD=5$L@*zGhFK&Pg5IKHAo;GhKa)b)>sUY7}bKH0vE za9zi)bU;_?K_0U1s&^f@R(bc^T^h7sY4S(P-bTL{gTmS|XIUvR1~k)Vv+xL4M*?;wSYJMAtV*ogP`uh#UE*L$fT5&dfkfQ!7F50x7ZEKx zmfkCD07czEF+_|w`Z^bJg_z-0Tt zk)1j9eM`@2rjsA^Ef=b-3c&U50vQ)vc4ylLsq^)*GPLnLbhU+B$yfA!76ti~ftcdrY=hY~sZf9~mdO@F+X3@JaQf!RO%YA}4( zsM|TZHhaJsql031wzjcDqy!JRa26R~5W?$`qDT{+U%s08Kr*6IcCT-E&vk@wcKWPr zeApd(svb%_Ce#3pPG6r+fZV+C!RzLG&dgiK(`l5Tj|4Qy6AXlWKsB2xQsT3k~{zu!x-X!?xK< z?BQ~-lwVzYMhn9X{ODz*hbyVm0K3o#*GRy~S&9Ws_|wf5=j;E`6yg@EBGiAgX>4Ny z2q$SkfVk}Hw+|6z2nP%9wz@e+g^Q^d7=IF$WEcLE8f$&6kQ9VOkCP5exFwzn#DdUi z0V}AWfXi#QT9Q#LaEat!`%HCWOv@xpSA8#A*B}tlZqa=LZxY%L-CBy!coPe@H!Gf0 zWUy>C!`EBOA3@?7c{{WeM4JMaCMrDu_zN3l3p7yF4>bJVME;w~DNV z`irgaAALrP{@E6T3^71cy>Z!U<8ONGiefcMK#m0y~YarRPmt6#bBEbRiNnh9(*8u~eU|*KNkFFnSwS?oOcp;bh}jPx0GNN`O+oS*OJ`huiTIf7%o0sM_7Ait#l2 znAw0R11(OCx>_yrQ79M*D3@w8rQvM~+VEVVjzjwdsCp8F;d*(bG|Lt$CKq`olN?bB zFkm{_T*Wv4wsQO!_-nc)`_?)7qzyk^WHc;gQ(92cq%f(;6zi{9*1YNG09XuY`b9;V z#j5AZoKm&9%A`Cx*hEnpm+DopKE8iABj#7KLLtxqoLl9%c1$4-ZgbwacG8xX#hKpQyT&7-x> zr&vjz7!zjxVmtO=B$C9M9;QTv$-%5^S~ji5h-1l{yr5dCxzZ(DyLJ;9Ur|+KL{msM zw+V!P!Ty|Ac)OZqX0kUd`^Wm=mmYXdk_FW)R2)$W!e~T#sUVYIQZcCES*sL)0|eEQ zr*6v+N6K}s#8}ja6425(c;!(_D;DF(Ko@5=Q9t)638)4O2*tj%JL#0PcRGz84@CY~xXU?`0~UMZ3!|4?YveqhWepP5iX@dLhZ}v@;SnD~uC9C! zAfKTpNaacN77nkly%s#dKw_a*TqhZI-d}aIgElbbsTNizszX_donPw*h_1pTqW%17 zGbNxS36=Kpq6ymPP5@A>QzXYqS|}S847Kd9*M%v1U2Pq}$B~}ihuhP|7Qp4|I}+2! z+s0V(#)Np&P-9JmkJrP9b#$78lInVtA;9`fi5yCnN>eGMhU~Y?71KGtu=^lZ@tN2_ zlK;HC6yMkEOV&X(`K)abG6C>Xl601xO(9Y7^elsM`?%a57C?Y3n)4}pgohpIr)y^d z-QF5W4N94kgrromG<-`PtTl-EvX877agY!x9CealdF$08KitP&xOf&tv2K>6cVUcQ zlBALlQcd&*h8&MD@-IUTk@tE+QlJH^0+W4_Iou?Arb><|o1+sl(Z#t)(`Dh6U*Vo(#1 z?#e3tpmaev*E>9`pR<_7Vr_W)wZDOr`ZJ|_M+klfi`aQuikeOc*`h`j_+z+NrU+QDNCHDhZg;naQn3c|5m z`8<^txZry=@jbz(jr=M9|Ary^&%UJU4j8OSI|OF$S8}^2)K35_CkN;MXHlXvQ@P)4 z@7<+06K(&)Qu3efLO9srSYg6R)g8q zCSTlS?(knOlEO!f;;;AFGriQl16P30TU8U~z?p3_;EevG@bhk}t99My`3!%v^94-@ z@Oiyu`*5f7yz8AarU&?X+*_-9fE7}fA_Z@;%lIk1$XruE*&iN_5|3h_xAS!yo!rHv zZGWb2vR(PZ#O^JZ(e3N~ae`caR6p-5d+Z2*>zzniJJsvsV80R|MItG)bK8=2o4hGY zibn77@@|`Kt8;(ZHg*I6#Fsu}8cKKo;?^K8gU=xNy;Qxs@R;P>iHZWRN$3v7`boFk zT)#d9^ym^5#oIp524mcy>9*9HyVcMMW$3tv+;fkJHu&sT`*-ifE`7RRUj3%1SUIe7 z-jF_B0v6^-G*q=nUP-4gwX7bl@zVbOg1(Do3e=9~@!IQMzj)sH1WS|ph&KcCn5x~33~LJ` zXkm>~Bjc-^KAj90DgG(-`$FRqUqOcPW{}XsD6IeTbLeF=ge|c6)@{x>%wwoS{vw10 zKi4(2)T#LO*>0(^5aX8$<+Tk8AV40*5?60rQFjjX{bVe6%{e6xR(RgC3{JsQWLuIu zcFwJF%_wXzQ3YWmQWmfW%q=Uld~1 z1>_C6l0CTci7e3L*aqb6Tg5~E0-n>n#7TN=mbTk+eJWMw)I&83C#=IIr;;~s94?WC zq{d0SfPSzq49p!@i!Ol4w9mei;>0%J@{ir+M4w~b;}6^!#R$hco^BMdV!wCBC|hl( z`<|a7%`QZddk3*aDom^qfFF@;uljCOo4-w~o|sxQY@rbv2V~5=9AsfP4;;dy4@ZWM zrsb+$s*JI-jiM}>TGA*TH?NW$Rr1e}{4~!q?w$sb`qEk3JNoEY&YSQd%7dJO#mD=? zS)DArciVsu@;5d$DP+b!Ra;=wJe_QO@L4yjAugPzatdKcku3}G0A0s&O$!-CO@o*A zL+SeDWPvIy+=GU&i7nV0Aq)ne1QHj~_FWheo_8f*(ekY4^?jdTBR0?-y{P$vM<^Hk z>;up1z0S*3?|msn9)yo{?tc!ii-tP8w<;0*=StEpKDVhy}K69;y&?==|*)_{4-CH>fm389x~y12+YD0kYo3+PyI16#tq;bW2!lojSQ zOR*RWJi;kTwajvuiP4I==~Tge-+>GPvD0z$TcfmLxCfoB>;X8cpq-$(DQSUsBGD-sL8bgLY=cc)*E_*CEa$5uk zPfY{AqC(zcHyA$RegXPf4|ZVwHREOa99ot*MRs!2J+|ektbSm>_tYA(j@(z zx;B|l=Ma~&Cp?0?DFOE8tYQ~G-$ny_PD2K1L#A=UCBIqt-z?$Z_GHBOmxT*vGT705 zZ^tS@q$8K-REop5y}$BIXobV!MiQDgy6mD~gi7`JVa9f|!1oFOs}Ox)1?|sx#jz`{ z;QF0__oVO{bdHvDWt=y(F+LNUm{uD)pj51vwoE;IJtMOQGb<6H$PB}ZX|Dk+_XjoQ zNlsErgG)D7hi2jnI;)dq#q9I(zbAHQ5pNH8xRUW6lGzo`iR4KM`DiuvPwR|15UP|L zSv}Xzd;z;yX1tda!rxIxtT^ORDY4iO-;E;yF`M5eT=i5(sm|L^Ly3q%=nEZ|r4Oo} z3;I^P6zfeKn|;gc89Wo?SOznB*}rrTiU!9uVg}Zm=3;3f8gtGow)F-p>^uuRUnT58 z{gRip!#mL9&RRS{rCI=wp0M#7FHeu&i1&g48^|j4MxzSQz|e9&Zx{BED8-^~!-*Wg z$JZ)ctto5eR;e6EcG(tXf*KvAS1W?EROQ+P>kw8&3+KRjo220@!`~K4^NUO5Ez3)V zFS(UDn~4fV`8)Alv#Ot78E>J3cyMLItGhQD?u{gctC7|*9Y7Ys6GOTu5ol+UL;qS)kqkHZbr29eKhRhwca zMGC9cGZSl5o8hlyYD#mr*ETJUfBo|nBhD}PB|OYO*N#HQVJOgRF4Quy_YL3#`N!xY$M$Prt(RmDw%%V-R)$4T@C~ne5Pu#ydBGCwq4XeIrX96XV$Kf7tP>IrNO@ zH+r=D)2iBL*46{(t%Wrs(IlIOm76dZAc&0YTCOhoC-ac1jA?!u(y{+1uow6-+5Ba`SYQ@Q3rWu{(H(0y?bV5&hYY3(! z>E!n<@}U*8;yLH+udhGfM9$<>p1*Fy$`oG3zSXguJM1^|93Qje$sMc6K%I znU_{5K?HGVHLOIN-?x{5T*=XbSUCvgra6by!RXY?qe@Xc(p_1Dx~-EXsz!WTd`znZH=?}81uJE9GLlVpj6!C&b*dBb!AbU7kbigwRpr_QkJ zA*Uy|-&Z}Bj0-DbRk=agJOolbBU3uSIm4) zYH*uLGNtYu?a>krN#wzbBw#HFWnph5x{ud=o_dqZ(MY?icbd3^Mo)w}O!);un`4EUO&-oVxCAP06ccZwi_@^*K@#^FxoPFt3 zppw_6#YJc>Vd>O_<`_LOz!t_wG|iMh|34qYg;ED_*B$LP*fMBcabk7-)OX)ZJuUm3{c8^3u1z+>Y>T?;6Fi&^-Z&$jG4yhk zD?fr;T7OJ-#GCK~1vqR<`+GgOS7`}ewLYzE6#IoYS{&myNB41g90Lso|IDW5wvt_S z=ruy4_wyN5NkzY|s$TUunQ9*9^-}7IutDMjlK$WvUw$cnXkB)rj~Vjmv|!{A*hs4e@G3@ z;&gyE05&YW_-Xn|DJs^}cxe(nZhDlP{`lerU%Pl3)0%KN6+!T2Yti`f5tB^eN?ls z{bsw^SbpPOoyUN4np6MXDdIixHCP7_^+c|BD0($L@P;E|tlC!!+%gE z*KVV(@};x$;d06r+q^R0zjf>LtJfr+7Y+R|`d$Avph8va)u^bdO zNV4Q^6LHdrsQueZ*LOr=&VL60Ip3255AH0YAP(vbSwcL)^{5Zr_RS4h)k5+Dn2+=En#XAsK>$Y(pp?ejKT77a#Ye6eLiM%Ag*kpGv6SLxL&+ z%=w?>E&&Yoon(LwkRju{QvyOHLsCF{NFd1w4Un102#t`T$#MY#$jgGr%fkN>hX68% z{(qpLgCrs{LjC`RBL9Ojk>v^?=lvlOfshPwOp5ZXhV40|>43w z$e{5t3{X(I@latFhC4k8#t&)fw zE;ZX6qJBQ1bCW;3`^S-vEI#d6(*|EzdsB}(`r%xGt~RW|6*5!e48vuFGVrfT5*CAMfCJvX8u>lZS{ zR-NBoh2kKVHn!`9oGaV@c%QW5w6@rsWlT70l^nMIr{wP^$eL(G&lUZz<5uqb4MvS4 ztI9PY)+OsaP{Dt{1do|#YzBC{TP-#y=mcQ@G64WdeHmaQWFj&`!|%ScbKPK*LY&`l zUi+rzvT_ZU0p4IsyD9V*^6lS8e3w!Bvj`qxYs^Btwd(**8{RQ`e;K&ZApKk0Y;Y2h zzF$l)`42sZt=6c$oh>%p&P32Yp`wQnuvRVx8nvG6~X`D zX8*eDfADOAM<~N=!bhxs-8A96_D!ba2HST}w|$pf|0t(LA*k@5It47l{OhW3Fu^}C z!6Vqe+D8g4voBfWbOd@&Oq@>i8HT%RyZ%Z4Ch?-p<_z%v&tP=(|I2Lx!9Rvk`#Znu zH!l3ny=2`BT#)mfiD3AiiTeNMiHOYi(EsL34C?L-!fy(p{|%>a`Ut=2 zi?;lKc>C{gxW4ue7*!K}^g0+_5R5K55ecG%=)IRPdS`SJT`&Y8YV;lvExIU)glN%2 z^d3Dpdq}=dp7J~AI)A+Hb?r4Xd+oLEb+^yGXV$%D?Ze3RHyS~Z*NyP?H|kU}(}wj= zIeu&69O3f;- z!)qj$wwUkgNt^|oIUH^HiuKw<2_M@#uAeZ>8kOiYV}>^xa*a&KvvSGsGU91LC>4H( zNn|jBGb_t>Gg~Oj0&z<@*faIUHk9ZfhB!Ea83XhH3-!4)GDz|wg98wUkplqq+keylUvUxs ze+9<>A8`@2|6{bJb$2zt`9xaP2Kf4bP3Ss&A}E!v)c2SPOXxAd4u<|8oCJ&9M;>1H z;j+tp>))D6>|1kBBlH<`mOtFqlvT@Q0)mo^d%%>me5C)sy!r|PfLEK%Hag+{V7O?$ zS#N^+Xh_Tnca#b!Coqx}h|Y4$LrPW|UhLZq>90ex_3VVzF=gsH9WluxDz}yEsrrCO zxAaC0)lBs&zQM1977w9s&^TM9fABZ}?VxdrP=D*{hX8_W#>oLliiJ277)DCSAmb-8 z#QkX<{!i=WqT7Hcdd5!5Vgiw_@HQ#3Er9T=fD|+?*O2ncpkJ-rl6{OX$)4%z5WDG+ zgA)w5yO@v_JbRKu9Bg(C`9HDtDt=zaT0Ug_v`)P}>?+*u-uV5i*0+F(V8K>oC%b@& zyJQ$&e^rM)Lyks)^kkAwNx2RF&KBtn+|HK${wvV7K0$&OI4M1`BpLlxjju!qe4+`5 z19y*hiHL82sg{_0Y)VV#E&W?brdo<~c$^sdQ`{pJBQ64RiyTG2I@^) zJWjyCLw|P)Oz2~ZRD_#jV==R}VDx?h`5q3$TU*tfu8-QRk3VI;ufShot(CB$SLd~= ztKxco_B{WBQ%U4}J^}&k$nxM*h0&$Hv4P6^?B(hD@H+j)-gJLqYb?BQ`{J~^CF@y6 z3QOm(@x}4pWZogzE&uM_Ahc^QH`-X$Qp_@YQ%56yQP-@6p7Nlj@)X)I zRo^uFrq6X?n)343uY1M*EOj)shPy9h>}DPuWM&}FJ}TDvw>J?aZ}L!mCO)f_OEKUn z*R3g#d8*NzUiV{>-3P~8Z>?Vm?AHA#r3Y77jA{QP);@xM3N8ae6nrpC-8_(_{JCt; zKN4i=O|Z*=ng1Z=&V@q*OugvHE_G~W`}BQ*rd08dz_T-!ht9P8u9Gbbe5v6cXA9mqC~9o;vc{#`g`XL> zUJmoXPgbqr$MA3P%ZoGE#jzAz?0mR>_Hut!yY-I$#S%qaCs#A^@tSeVYi8Nk_1Xw# zg$>DlG4q5;np=ZytI_I#9Y*g~l*NsSa)P$LZRBfKL>jI&N6I$m#4b*f9=$v6zJF}? z-VS)4K-Z4Y8m4Kgn!v*-J(LgUUXr^#qp#f1dyFgV#@yhIx!nym;~O3GHPF7tc5grw zm{iewB9ubk-+K%<-4)MEvu7f!>FO5fDQife>Y>W!sJ=gl8asry-ER6_oIga$Uqn-% zKh36@2qf?`zjNqC@!I8p^I43u{)Vb!$2O&Qj=ScnUaJA_=dv$_C2}xCiz=1R(~kxD z#epk_>mBXz-AUyomG;e$pk3*A&*s-2iwkB%T@nd?U9{M(WA#5{S`hrI*>8Aj_1tS* zBiy*o`~1cS*pvW>Y;P=A_+E^62}<1zoCB0|9zI^jpc$30R+KQlNiFL!Z&8;tGIjFB zUN-UBm{C^whlMsov~qWuFx?ELf5g;anA;Xpa#4z4;T>WS+RYKV(TK+5n0hHv&`(sj zkI(mA$TylsK2KmSXLiLao1139d*;*Y`a5jg`vUaiR1@WAx3=WdYM<%Db9Ua?dcGAJ z*seUc9K44^k*SEI-fVj~-z;KKI-v$HVNoE&w{V1S$A%k3jZ<>n@i2Q^XkL;r0i_o= zz-R?W#A*no$!V`fjBR`E{~D~X-xn5w>z1V#Q@u5^UOhk`s}Wo`U0pN$qRN*b!FoYp zjXmr7Fd(HkOuotcXx`ziZ}_}|Kv#%W?2B|#cCnFFYsF`u42Hd0F^`-H#8rJG>x&k8 z7T^0syg(R91v{{;qp3e^o%nXK2i@RwK6*THr_RM@eaVS)>vQznR!OzNl>g(iF}TVs zgEQ?+dbMLJ`-DW^(NDve0H2t3yDf!=wu4DSPxr84!?XU;7*y(hpO>8y;zyp1kHk~m za5ZY(<$p;3I3`+lA3ilnYw|kkx@f2~Jq5Qo*NUDuAjC=>S9e^L8V?)J%F02XA9!!h z2v5GTTC;z!bK1R>!0-By$+SEz4-+m~++D9?JDGGKNFp(!3Oaip&W}aoTkqDK^{{Dh ztiwE2pQbx}`O)kPhRTy6#rut0x&5P!aZFEc8+$zvecCx8MqPP%@4_X?EbHy}wUg!O zl(m@7#OGxoC3sSTspH)o&BmBtt=-x%iErxTB3caOy9z- zj=Eo*^QU&WxL(S9=!g}lhzPI7+(sx;f}n6pqWI5eIGQO-J7(&DFj4Xq^9}=0gx;@_ zQdj%rfM*S*G(6R z_H8xJP#yjkWA1Y5V9cMLK~h^q9qF%zPi(uoTwN8`%hVLwntC@5Mtn2a{aZ6J;nttV zMvBOpYTV-7=~Nk>_08Yv^w@MQB&=|Rf6}Vg?v?BFfZ4YwRm9P}v2U+*zYN!~PFY8k z3p-%2%y@agyzaZeH;?EVEA)G|%g9e6y|?Xl@4%WQspTN*C+Z}|r|D#CeZQkx(P(|{+<~%R5eN<;KT!kIq z+Af?JTC4|t%6{^;r`7Q6V~H}TXDK3Xbt*vTLYmR;aW;b&D5IfFtgv#1^vJS{rf0=d zO4IdNy?(iN_LJa^=HrDIgzHXT=2Ckdc%9Qm^D0=5(~a6#$8V31KP_Hn#Hor_j#jy| zwgxb$wfb|bv|$NTNx4N2nN{daMrqGIya3Kf!;m)k)xc#Xo#+fs*@zn-V3 zjAoT4ENpa1IQ@X7RvMKg@O|J|!oJ(|mGon^<$21T?#-e3){f%5tR60xFM&!!9E za&h1}zlE3kxsMffYJZe;eKQbwnJsa8KMzWyTd$J$vmCUFuVv?+v*mDf32HjFrT2RE zI62nmJ7C1I){6ba^{Bm3jvpa6K;%_DqsK1>8`5SZ4n!s6M8&x#sNG@FZV!xnn>Yp?4ji+TlZBEVeb#6c7TcIz zI)QS9$I#q*d{Qd+Ih}L1_2!dHs$Mp_>H2t({*1@wr>0cl+NQ=r>7KLf@bn9X+2$&P z*WUiI8D2-0!JH)!^)8_(S21w>Ba{V}%U)FOg&hHhs zR8lItJ4=oirJ=a|h$Rb7S=xJ&tq5;cPs}`pYwvpb?aJIA&3deNdAjoe>U=KIeNpL~ z*7xo^bml?uOL{Fa1i5!p-Q#kwdDO2x(nxm=t&ySI?A_~*WgH@&q?K*>DtPoH;(hKZJ2SzCaAQRtks@>YYI(z z05cAGy=h2eaCC#AuFW-x7f-g_KrY(V=h%Ia_p4$T*HmlELGwGwrE*`{FXv-3|3)DWuM!Qj|SYGLgL;b+Gs(+@VN8hP0gFn44ou5h__j} zm~==no~O0xVD-tWkq0-2tEJC|<)^jbwYiv7Mw^6%RSs~4`(*J=wdd%NlXsuK^$CsQ zjm7#-NEz{7gtXg~mmtJB&z}2Rpe06su!*G=FH_|{Y=M{(hk=Vd^x(rOR<~>Z0EWUeG+#AT=^3=M;DVOTOy;sPQlXNDEk@Vb*1 zd~8SDp$CECmTRTTnaM>peC}EWANxjh)9%n{SevgsQO@+$HyWL7Fc3H{pOSGen3A&$ zUgK&ASpzpj$Zn8TX#?{}-wBHOzti<$71u1#agb=rZ1~b|wG&>>gf;S#%51ku=vXk^ zB@eCy7|7-VWTM1Ohw-&`T29c`Q~ico<|f=j9r#K7ZaNzH)t&N9PQFu;@i2It z)2t%0nc*;eoUK!m>5!_5C(@r`LkzL`ioCsLf1Hj3`0d|us76#p(P>2JD-UoZ+$qU$ zh+Xw5(*NEDuIX%p9fkb3=gUcXqQlHwWW%_~X2=y?7?SRNdraFhNEumPU2qCJh#3K5 z2jLJ?f6V>I?dRq1i z(?hjE-bVILBO-u<^xtQ|tZk~HChP0qanJCH2!@MH(?e7C;E%kGmA!zGF-(z$(*+F9 zOWyvl(;sM<9@z+#Gj?>Kqd%$XEM864F4h^6$lVPlGoHw1MnuCc5GjbtilPpfG~{i3 zEj=#Wv4NPn1)?FKvZ9wqp5HgLwX1af-4F3=Le}tVA^>euS=|H*DC|nB z!1M#Hrgf@B5)tzCiqoU;i7;Re#?%AgbcWaWzc`g8ai&PdE`Itp!j5q(2QT|h$3_k? zSIpZ;1xy?RLp+Q0zq^46I0T>xImiZnl`7H-{JlfO-HH0V%%%G=ID2?=!w&yYLBl%V3U3fD3=hg;_vr z;fyPIHMmi~QCE3|I>14v?oKIK2ETjyHVP?BM1u)cp<)R z8AI77zN};nd;O8umz@du`dV2HvuYc^23PJE;G^wo z7|o`KCJAALx>)Vkfh8IUETOCm+yG8VoIzjjPRUbAy8|)-2r>2GMj{# zh+PPX>@m``dPqC_0xpL%qdXF9GFQ-_Av_EH2b)Oi8Un5h*Z=_CRl_R~|6f8f1Bmia zkCgbLCy&J2wWN48-7be;g*6jJr_L;Ij%-xl>_ZtDs7ALlnm{L7P>kecnDGP7geK6b zPz0ZE1o5Ge$u_z6az9hs{#6ylxG3hi@#;Ul2&T9h%!e}VHi)|aL0oXuRT%ni-4#t{ zFC<<)?Azw(~L`woW8TXQE>Z=c4>d?Zxa7Vdbg{%#fB5^yRd-Lmw?jPJP+XA?? zyTYygZ`^(yMdG&J9f{j%pZ~_~upJTE%$yq61P*8NZd;Ox5od4TQS(i*EU2p6NnxW%Lu}UUs)M|ZKkQv z*UdWP|A#I7Uk0}Rf62lK@GTJd-%VRnU1Ze_hz$BVP>Q_yZInjX1&qow96kdA@~n7S zgk8a?Je7=~{(26d3>k1&eItptyWLavqpe9$ZD}sJEHRCo?@VDL=h9 zsX!$ySh9|c{~qVSEmXL1J?A$H5E?8XGR?uWcdx@LVOwMJn81{+F$LM5FpG@U8zg2~ zglEy?)}1ZDtp)dt9Z0^IBJU_t8-J)E!}|YU5jo&=U0!AO`~dyC0c=rElY8lBM^u<) zb^Ivb+2Ps|PpkjQV1JgeomMKRBwhuIh4!*;WqK30Lc781wTwW|5 zWO|s=(z%KnA4kv|{owy$4EOgr?=WsDSzPGb9EO*~F8y4BkHXFe`!A8H;T4Ok>0LyM z3?4CZV?+poloP~@CIG#f=8f><1ObH*C`3RZ1_}vKNP$8I6mp;2}4yGq@7&~lWs%(bYn^wlSU(&O} zyHpVV>R=|SBg-c5fHm&z2J!PvpQ&`xy9;~2nteCu_z(^1U?I4g-N~_7$tpFD!_ z7C$DgdCc~m>8VR4O~-MgkX89u1f$P+2-}K&B)3;4$a?ZgdJK0Mb?}1ki&@Z5k78x0 z=Di3=(Gy?AXXw&!vLQRm3G@a2vF~96DDv?KUNZSrCg@LJZz#=p+~Lu}JOmR?sqyVG zs>GERb1MpQPGYg^~J| zITpOd|LB9Av83B2O0wJF1mcwj9Z5ZoCKweJO@JSP{}^0@g~Ox62ZiuK5y0cl9wT?e zG}Qx>(n4`~)J$D09o-;M0e%QC(GdmnUenh1km=rN&0Cq%lYk`FkO8Q_{ z1dlfO4S^vJj~vX=4d~|z5&TVx@Bbzx_!lWmK>>)M0Fn!3BrPl&K_TS05MTpO;O*ZC zi(K)DP|*eB686fvd)CP$bUf@uNq?g{Zigm@7NFfb>Y5I?djJ@J3`5)$~A zOqfD~5Fx>9bqEPx4;8Nu#>M*62{CAlNsV~#2FAG30g;d>1ULXD0aXg~LWFs*`wCyn zkH|6r@6w+5fwpF=R)I!UaOPJ z9E|rb{S2{S(_Gun!~zVv!OIVU^711!q>Uw!ZMA1%Nlm{$~#eHalu_F!x>=#}t)`#ThR z%@rL~@V~YH7tIPcz!Lz8oG<|fq1O!lCJ%E2^Inms<-4*01PWmOKVSv@jeSHTu)zS9 zfFSa^q$EPD4d-uV@d*HZ1+Ik0{0CTEXneo@cHIVyNAjodKfLh?UmFmqZiJx?SRh3g zOn2p3h!GnwB?4jx#zhklM4Z@wd;htF4&}f04TP=z|02r&+bfVnG5LicQ2u{8EYSCN zka+q8X@K9t{KF8?6b80NIB9|jZ$brlfgs0=C~*a|{3Q}X!ybqsnGRq)Bxj!XU>1a; z8yF&X6%8SRzu&HK4-vYu8AM0~sWXW1)iuC^|3uI$F9mc-sE2o@OY(=pSI!C%xv~O8 zoX`X-xWD1?{y%ALjRcTzvu>-Uem>YEQG_OWNYCH(T75R_u{+e6xjdx zni~K0kWl{Lqwrr1`aih+M_B?0z_aLh_<%tEoAz}i1hjT7H}qP+hX1-pKm~*mwjN+W zv7#c}P<|mK6TlEQ++OysuC`7t{DRKj<`8}0R)Xq-yp?!@Zz4uKz!Ye|Yao2QLfrgN z5h$R7tA4`H&h|E<{DK~Q-cJAYgFuBuxP_oV+yB`LxV!wJPKfaG1QVeBsmbsJ)1e89 z{&SfQO-SUQ6GB2CL04C6b0?^fs6C*`KbJ(jfKDR+>O_d}_X24CuAvv?6XX`=6$XOI zHOEjhS7Ba9b4yzRQ$C2kD8kemKqnw5Az~TmhWfh#AW8_bg$kP6Svgocm|F?|X^Jhx z%gYUX@dCE0hI@m_QF&8*{`7D327`W|&v}FCuRijl@e2J*0)(y)81zp~fDiZvwGb4r z|CK65y#<9_0Op){MFBUt?nZ{F@d48ULF=;*Sm64N3_;@y5WlJ-L#X}rISlxW2K{@u zK3`zC>l!k|jxV66KbM*P{%WiH_em`B4+`ad;%EkRT zmxkyI3h^2OM!2gD;r$CNf_(Kv;owYENx?q|*MvQGv^9rWSR%J9|Bu11LJ#tbn7BBP zvZbT7n++7g4;2RP?drT3bijW!p#W`&tDB3ZsRNEz#-=^$&I3)1m!WHNene~yC5Nd8>|?GNerGDoLP8A6m1l3qjR?-s#!Mf zBOEh`L}Ux4iaE2wS%>YNLy38T5Eq#lHNC(`@oX97In3|X^e}E=oQ{XG&f8)ZDSXC= zE&#i9*xc5Oy)h(`^d#^XyGpN^mdM|=ZEdNz+k?bP^9@ber8S@zD^2XT6X z%4NdwZ6u<-6Q47{DQY*vE(Df>Yf)EVXa*q78;~(99aKI_6QOWad|sx63lalIlomG& z{rP5cy+`LtL6;KuHFc-Q!wt@dzjyT3d6<;o>ds9^aIN>;43D>e3v(g$!g)(ZwOGoU z_+u1hAP@z6EY^`)rfa?X?DSPn_r-^)i+ho6gp^lv4dHi8Q2p>DbdZxsRwL$lki^cc z`1D1Iu#{Zb2=gJhKWrh_ThTyN#VewhRZw5RmNp|9mTStNslAoXb z($UFAeSzmci`7E=VY-*$xZ7`SqBX-)pqVEBZBZy9SQ{12V>lbd*|_uhaQ}OQoB5!z zf~)3DNPpOzxh92rt#RNUMLZv~CGd#(U(!FmW<~Y{cXya)(9h!Hx^StTV~}2Mj9>C? zPFa*vNIt5L@-@b^SN$%2_l_4TXLS(5wS6r=fs1}YlcBRiQ8UcWbWm72L+6H36`7gY z&9z|m;TRtgI8OowDX}OAUu64g;H&$}{<7pvhJhIDr>6AJLF^0cN)0xg=%>k*?Zqf8 zuc<}UFCX1(DWl^hcq=6BO>*}pc25>6wqEu_P6&EpZHKSu9AkVDdRLB$^o_iA88dFX zVVlCGyr`(excSAXAR_%&GdI`+6PBep*|M3rs%X^OKEP>dSn5-siv>LwV=l>fPVBm8 zs!|Xy@JK~Tc1T0mX$zG!SlK*7Si^ zyh-`EWEpQAPrrv5&$IaBMfT&lHy0RZEaCUC>j&8TdHbSEcF;G7HY|-9mzVtw6v4GOi2t;Z2lP(D%(TxamgCSH65Vs{#0=An|`V5il#1szW=i-uCe$EhKfS% zhGMO>qcm!+6W=}1$-$4Rt!~GfT(`QkXQ(W?16DkFHea3)KP{8wU?T9qOz}+K zFcNEEw1)WVO3$jz?<2HVGXgy29=VVHDEQpWT++gyknrYf(jkS;kxlK1qkn+Vps)vBdRsX2a}z9a6f(A9RB z$fxRT7d!ekl`cSyFIAs!1<$O7hQ`!thqVb<;Y#QmCa|%UnT{%o4=EI4WYg;Ahdk1e zlWY|=gPTIi?sSj}-BNMCOGBh-3&JigF5V!(?yJ^R(=d7_L_vQ$jR2d2kgU{@uvTR5 z)~Hx*clE%~htLcbo)CQL0U^B@vzqp@_oAKDs-0%S4|XcY#6gC>RzuS{xEbp>?vFy>elx9XQqPUn$?h(KxCT_gJ|>8=6Z%PZjNQ zyTj~~2t&Q-m%}6eV|Is|Wgj=C=bdLzzY9or!`Y+8Wi7mjqVhwIUhLk;$dGDY>`aT* z_=a4%Ogi8_QUy(jb*Ymm^k!s2dB(MuYjAbsDh502-`~SKKY)Sj$^$1 z4Y{!Tba8?H3l|S^wohiDGyl}kS(DrKO!8h3KE(=SE6f`5egUsQ|MFaPZFe`W`gz

te3pZNsUA$|!)SdY@HVSOMZTFu7+x)l{NoLi} zr4KP{(>IKF%$KrTJisuy!^4C9;K~B1j_@P zB;!@nOs>9bYJ4M(K0AJ-PjHCm=H%289ej65j9<~=oovM_zxfIJMN?D3z(z(N&Shfh z_Mzj)i;O!=-%_7IImoH@i}$raEVlI=Uxh-t9PjtR?oLUf5V1we4d@nAaeazbuxgb{ zY?Y(-+|0Q>X-Xa|hbziPRd4d%OLj8isW{zR|IOv?^s=&|iqvK;smJbKIPffol~TBa zU6*R8O8la9uNKtYY6?fK{-0VY>t0@ z@B{hi%Qm}G+KV&Avhrt{v>c73NwTtP$vQ=A_LWNRk0{r(2M~2|JtHBYqbBYCY!O_U zzSpKvh(S7xe=&tbVVnA}#iy~XxhD7Vdz%^u>WM(sr_ItX@Unst zG*I&cJGAncMgP1UBH33>lH~e>X76Hy$~dacxN#!y8yb)BOEwh0RlNN*<`W*-ou@Sd zJWsU}BKv^aF8g&8UT4{FYdghc>+Gjwz#2Kz06u!kIEHwHQ?SA()QGLuOw4_ex&P zTk(gbBUHZaDVL^4or}de_v+#k2BHhwc{}sDGqhhKvUu`kms5$A@Ql-+kECX3xVt}9 z`X-wgahw;jXqQC&f+|_v-#j{Guz-@%eEEl%iGq5~c%yjFXx&>&Z3mO;TaD82V`>kg zvzemFt~!o`&`0Xk=3m#QEot_n41$L4w8tfg+VP~GqSTDR{SDNMro4J)(o)E+6%v~7 zIV4OZetC4XQ1gUDQs2JjF%Pt}CmPF~tB6%)^6t+=krXh)iMAWBgoF4=Wn05Exx5_XC7(oUYGyl+q^8>oh-P;1FT&4jOO-s= z8|}vhA@_{(sPT>v2YV|Xg>Lwh;*Zrj{54!QMiCw#>Dv9cKI84sX3|(!yKopLJ$d9A zYNY;IJU_B71ua?R-Iq!}vsd&_ee)w6?K6sh{fcGL=bZ4LSzzSxuk^e0UutYTn$>Tq z@zu3o=R@iAetLI@Sd&kV+01zhHAPlO=wZ_H_l-W?^@pU7OIQ-qY?E~i;q?6tSe|rM z^mn{=oIG4omaLLo-JP3_(;^^SCUZFW_zhdnIb{fqOpj8VNMfrDpt!ng29hf|1 zw^)^3sv^#BLk}#-6q*KjaBvOpM}Syz+Cp!Y>?TX+LKS(fzhr zj)ny@h?b~U^bQ+W9f@=34p&?RCSQ~`vBbVe*_g>y7*@zzc=!cF&Q*|{$K#=LY!zHl zDL2<9P_z`n`jMEt{k`l8Gg$`a+m1t&#=`pIRlRom2^a-=#m0LPFe>~3s#*|#4o&;Z z7cbaCC4PL>rk^4tiNcIF>jhCHhNTf$hv~5P=JT^!YcBGS>%iC zTQQAE*kKQoX%<*Fs0NP_!5H3*OeS-;E3>@jTDlf=ZV{QNN2h9v8?Z*k5E0sDh&XLm z@ksHM=n&t(kHrOi`FNfRFJCD}f96%lsSz!|adS7{5=S>%%M}hgZ#6J&ZpvD562VEw6N6khB!l(S zJS<|oa(CK9tNRyJ)Mic|%YWZ*NX*x2>~CmlEEpl=)lSa{h!A^RGHg+>xVoNpNE~;I z$B6khFU8{*S{!b4`L8~_*0fpbEYPB$-?)NE221HM(oxXyvC0BpI@C*e)c;T6E1=gjEPBq zDmum^%Kb)YrY-ltZU^o^^(-qi@%B71ZBl723!`ox{?E0-=E&OyIl)5qZ-w@po}#Zi zbBNOCfT!erO$8mpT*(yDI6upLxT7a~E8^RVv(%>iEmsx}o0@QYrsXXo=w7zcTf&Om zl!CyT>WFfarmf)_r?e2xo#)DdHQK_IrJf*PZxG4bf?Ru)K7uf~WBrsmLcjXR)Y$CV zyKj7*DV|ai3YX+bXmliPRP4{UFev;k1|4f? zj7dvh7v5UM@hh{4NHVe_6We?lb4&DA%9D^M(y( z-{lSHleUcDOxr&F5asqbf`HO$>eI^(#JK&X?3(A%$7#@`f}kYjyNZKlTQw$Mq0e?4 zv}{^`k>#s$e|qFzhBi;?uKD)Wi$SvL4VG`6wjP8-SUHMv+PZM`px(!$gr03-_2G^+ zE6wCN@TC?aVS@<$A(@{jb0mS=k2;ME(7nd+kI8;zF%v8Vh}uSITsrRw%z-|9i%$Ar zbtldCJr5Mdhro13YcvV%5G(Ik#)Oj=;2^M%aOjDQNT15D1_GNV<%r40MFv2~QS`db z7tj|fA}CnW{kD2G{MSd9#lmtr61J?i||GeyG-GGz1K2&VOd;6^8 z`5> zYUz{up*^{_FeQ&NjRoTlGCELd6UFxKx$JOo*d= za1fi|Rc;eVwEUe%xytGMopljL>_*d))K?dP!Pp3uiQnc$oK}G2fpq|L$c+3y*_<1K zSGiq;a}Agou~`Z36oUxyBiEH6v!}ce0X{*9fQSI{QL|U|$U0tN1&r|jur{z3MTQT9 zt)8eFT#Cvj_$U4P7pp*C{VMnVPrgYATEAEWK4n6@mLa&xH$f0MU&>EFCi z=qg);$e04s)tBSoC`_aSLJ)BiU^Z;1=pToyn*h5KU0vblLymv_iV&Fum*M}Nm=Z!% z`C_xx(|iMeL}e2KGMiTmasKA?%IW`7DzI?oN~uiKU~~cmZT25_AFYGy(SVECF8|K% zl~E8wTVP1N%?2196&*uk-AGk1AR(wGEcUM`YrI@R9jA z2%`8GH~}CgilBAZ zBo6|6xs?c=S)v&Uh20E36B%^7$FpKn4pC9cTN@DG`%Fbkra5JG!}J%WrogIa@jJ25 z?Af05lNsMuZ+iElONqMaV&9KN8imF1VSGZAN`}ZGPfhQx`}0ck{3vVfQ^o4vdmg@1 zJR9;vX}3_mv>M5~)#2Wn0J{N!Dj(4b7iI6vlpZOVpLeB}r|U@;*!`m2zd()GKsRY{ z{n38fweZg9t4<4jKPHESPnCQ<8coy z>?>8Z-0^KoM(C+F&EW9*6G}UJeJl;*JS;bM#ebh|jxzt*m3qyZwz@U?6H`RxMWAS^ z>FqCu!M0!~i%+_5pLBIKCR3m)!_Cfb>j>0beESq?k1Fu^SmgwFU7ITL^0(rswWbPCiH z_qT#8UXcc%^8F}LL($l^ZEb%?t&IC#PCPQ>N?Ozi z<6iqoWU>>(f>&y!2xf6myx51#`?&3T)pQN7Y=mr{?Ig@}8Xlt?D3(17Ut>wAhOlZu~9B%q58U!c(AooBi2`U*2Ca`~LPK=fiM=nyhiT!lW5ThWAJL%?g zZF=@jXO(bUH4viRKnJ5=?rdB`g)(q;}X7#VB`{B0dCfBz&;Cjd7Q#HZeAbVM^V6I(J zFicKd>cTpyoaH6K5~YF}IA*uqi$=NgjI>F$%a?3MH$LHJuLRLD<3LCO^TVC86gFEN z)PB-y>!3@gt`5mD*U6`foKE?aUt<)v zk9o?+iVPE>d(xLPnqwUyjy`F22Lwl>4isx8q0?mc!IyqWGg*06qg zXjyOT5loY-urKnqi+9pC5+1vY>#?0da~YgmBX*AavG~ve!wXI5c|#?YM;q=U<(o+~ zv26SRkV@@5=)Is5Td7P5Kfdee{I872(bwQDX2)75%pF3#{0I}C(Ppgjkjyzq`7xrB zSPK_sTJqH-lq+Ku{@r1wwHw7DDGz*F4l*;#m8m4VheHYJf;ylXI?i~ zK7SePw1@rT9L!qS&UG&iYMhf4xxY2!D7WrKG&w}u&NC$WgwRf&IEz;5DN}DKrxPCI zWLC3s~Ypi)>QlG@k-6v7)s=AusP4lEQ}AZ zRmK<@jn_}@%Ae7{e_TLcPD|1DeSD9955Jk9BDuYPq4(IScD7{Rquap?TauCPk#u)L zQ7whxU3$`#1-m5pr?NG!+Nkw8BfrxKX4y9y=+kWCjFPtlc=A2zo~5fXn!cq!&z&V^ zYOxIzNX$y`>}7Mq$W+-bq{sDqruq!lcW^w4$nI*zd>IalOvYm*>Fu&0Xb3N5sDFOe zYgC=(Clm4cgPWuT#{f|ZRx5eLcfkiwNGrysUN<~A&8aDNg{v;p-)VhH(G3g5ehn&d z`svvga%?4LLf;fMCUcx>6ZtZA2Pa+`*zq}L%zcr3kJmd`{J~@;;(XD3kLBdWuMj^~ z=g+ys2Vaz5glWff=W7p%t)jcp8=bAru6PD(^b#}5!e42=CMTbNJ&LuyJIU(D?9=IQ z20k%(-JoBiz7G%mVLOQX!aPytA`Pu?T}u2*!q~1Un_Ky2Q)5kj&Fu@KastPZTlB}D z(=!6?)g;P0IEP@rSk_MTI|G~c|Cco8^RQ9Z5&Tr=)C(p z`n>sk=nlG(vpU;p7Z;T4UZ?tk+pf#5%&zOM>%*8If`f&LDtheG>~%_T#LZs0rQJP@ z2CbHdGu-rQYieS~p$*|%`{!fwt{nPNAP zzxj;g_Ps^h@ty>o(o5M!-Zaug80OEPt2!e&LG5f#67YdScrcSl+*rGWMT!WGW7oki z>SHinhwf)3*R&+I`~=_$PgQA?_i5C2ANVyACqBf8p>>4Rwcl7}_ot9Z_Rk@ZBn=45 zomI#p>W=IYAi>_3t_Y(sec(rCP*g-b%UmM^(O_VvlU?_SQDe7S@MqCWrmnU9=IpV3 zSBzJgG6XKlJ(7W|&Qp*bHXbls+X z3vq4!yAw{jzX(=h4ox2ZqV`)L*|{}!LpALoXaaK=IKHzs_lpAtBr2N z&1Y^WjP-JznDDlBDrG$R%O>4lOv=FXQU-VH)f-*mpWA0{^3S1(M8i(V4te#)@#Qnk zS4WTUn?hT*Wl{;@;#+KYQb~+azR!6d=a&Zghz9e;CJ68PSA^fV18q^ZS;>gf zf`9unkp?R$Dg|Gn!mW2MQ3m~tf`aUDU4N+1Gl025+fhX%iFTk5@0kCKzfs(`CAYi@ z2dyYOAu4>IOsxc#7Sk;!Ws-x$tO^QjW5#evV=X=NKA2qsUR?nXOqpIt= z=fqAlE>zg?1eyV~)Q!E#TzKk4JKTi110*+e^U<|^*Khq0JU6ud%ALx;>E)@)hLeA5 zC2F_tQt!+AtJP$ETHPcT)31sQ@_zSma`(hfPTE3%PF|I_rC0#jDyxSqjdbzxwU-6Z z+q>}6w0LR#J7*Uc)miKD+YxKIjUAFaxKiArmrm^wL;Ki(F0IJQK&X=6;% zgk9!P6%enqRP|q33T<)RNOuwy5^boWqqK|sEdq|nS2#N zR*#Lo#gR6U%O;k@wCeftTf+g1X%Iz8NmypG(07ke3vig|^_sEK`Sc98lBB$HDn0>W zPw}5&qv~k^XsoG$?CimxYy0gmby}A{CF9H~w4fKdB{bMPbtE0)tA~0T8-9GqaJWuR zQUnFWO}b4!Ufvet_4?!6ZHXG@GIKCjm&(y9dixv$6}DDJGAiOUT}F&DF)>3Okm8## znx#h9WarD>OThw~5-N0P@+i(iH6130>dT41{b{C)7*fpZCH$#!<9Fnml|z>QT!lk$ z+^WV|-aJgWLkK9z9-^hLDq?ur(8Zc$r;bG331FxG#AE$k-u`q$tG!8J1S5~_tlQ7@ z`EeWqG;oBa!18L6n0x0BCM4@L4;Nlzg3_(B4mmRJ3;}!6?qT(Bh26)FZijkG8*vTr zWy>Y69#{!>LKxD={bQO4hN^81woe{Sz)EaFCDyiM3-`Qe%o|9s-gZkg5r`3E5^ajv z6RYL#L^yPc>(JkdRxog0mnn&>X|fS=i_07Vgr7?0k9544O3rw$a@z_N%dS+Sw6*c9 zf6PA{@SO-A=zM#VXzGoyd5^?c^$n%I;(du|=lr%ZaK&f3du5E=8^C57sH z*IRY_l?=%Qw~Um^B|orFjX;0`5{*K#hv=O3`OS1on_71BtCmwwqZjQ?hnx+%UPysHL7i>+Chp&t<6#F|E zJWH~1W{eXB$OW+`iKj5(biO&O)G^Ua{W7Po;dJlpT}wG=lMjN0TLssqPRE1ljXGB(gt;G9ZqgkU%&BN)2z-*UYE9ymS6V@9qx#gV+J=1{m6p z-t@BwCPOx>+*a>(f{k-Nv{bEX0DV$JuEe%p&=5dROBm+FH?+ z2*-!IzHW0nJ|&EB9rfqK*gf|prNVSVaYW&%@!Wz)dNqYYg^U`lbz3lpq)b9AhxxB! z8f&i@L@^DHIIDH*(fHCRj!r;2S3ITU$g>W zM-De;Rcx9Cxiq`VG5hS-3$cwb)+sfWO3V?!H_-79Zw*@mZSqY^$K8D6g43v#8%fOm zC`Z(Sa0oB7#S=-Nk*H@db`v~Mr2jA#h-8gX>08t0xmo8)|CbLz5kvJ)Bnf2};LP?q56>iMm8TCTs4>D{76zqdxiE*RQ&lxW|OIhY|46p;I_a=xm;p z5S8v@hmMn8EuIU0K2KbJux(R)%t=&zR8G1B4GG04MUQrkyk9&@dJ#W*Xd%}}Gp)LO zTJ(Tau?a9EAm+aO8>5rq6S}yIIMV zF>fc#!6m>giyqx)u3iI-R4t|w6xcc?W$OVK755lyn^G?{j7pPdB=~@*F=1qTSDwanICK(XXn@I?Cwy{0AG&`+`c6}YD8~gFA zyFu4&5!smLrOkwV949ncQ&Y1!p{#=#YGk{P*k)qeQxF=*LIVW?AeFxrD$$ABJnRKr zy$F45)PcSABCASX#(=A6X<}{9_px>7s@X>rp{SWZL3FLTw}Cwm7VC&9fHOFBGjQXm zc6M>_MYG>;Zc&F~!A! z7%L%j{_8A_({5fJr_!oN3#Z-sg-{b%X)Q%s>t^BR%#B^0!RmtCzRW#P9)xsQm)3jN zvqZ)ztg6=^83r}pBBn5SP+rA38+w;aHcN)p`}gi_No79@CVOeQt-336_;aLxs38oi zp-T$sEp9KM(gX9{mh@lOH&@JSgw~kYnzizt8=HsQm(HX!x6&H7t%4Q0&9Pc#nH==KDC3Q1e8Zy`cW|#@FtsQ0E?U|7 zmTh1d(B(_sfMS7ckrp_k4vafYsu!r@(!P~{G0g6WHEPI>5LyQ0&gQcA7+2X}Y(a$c7@6bx_pw=--7{ZimgD}-7 zj4~a+31EOFMaAX_6rpKLW18H4Xy4VPLbig~&&q}V-T~>FyPrdL4n#vT65$9$n;n=% z{3?Mp5sp1TGK17ay4DkE1w&whzxQVcj6WY^4pl##x)({YP;f_T4S`sKWZ3nF+`^yv zgQ%?w5%O0|YDCQCk6+N>1EhN`zmU?x$wtHwLBDx;Q6(lq>_9RPQWN{Q0h!NmBVl?2 zTZFG7#3tYpATlYiaZ8CL@7~BCk{k$ z0g_M(gPuBcDN+O2!*Ek0vp1UPLmp%)vY4>haEzU|XHAy4eIR8km=oK#q1YZw+#sH$ zeMuJVI{2Z%&o7HC#7_8oXsx(kN%bKUP;HIb_NWL;`V*fG^N@?lm-;2c*-<|s*z@q6 zu;s<={G-sAL(-p9STgnrOC>WAQU<#HJ(a^Ad}0uCiJizMdfvv3zV4C7L>X(mxoANk zh07UpnNSRyvjC|-@br*f&{FyZ2Ix_RL$Fv#ZUI{19$0#z9-PCrMreCYwYax@TIj-v z^t@c66nk`9q0j8C0#iZ+`Y|4m!;6lRZ>Fti8l=?$^k~a{>fz@*XV20zh|8o~P|GG$ zli?)2jE+QmRki51Tv{Qm#J8v$$im_skk!&}yc?*(u)rVA9S9l}TS&I3*8xphUd(%< zttd-m_WnoDVUEHZ!OvhD(a#7mD1BAo1iM@V3bn+yWCJKW#;ruRXswX9D$l%o%)3+1 zuQ#|GSfA_y$Ui8A!2gg6jo#9>;@n!dqTFga3h!COO!q*B>+ax$vwEO9(eHWBKoFqm z8e^Cc2mlFzIL*Bjx5B;dG1Gko;g>gZ14K8tdx|mBy%^!s{Ry|ieKjCOwr$4^XeElP zP(!j0Y%Yo}uxZjRSlzwr9^!DaE-2l7hyHOwAPi%8ci7T1xCitas$t0Y@S0xtf#qH8 zfzFwj=Pwr`8^cb*7ZPuf0ageu$%U0Kc10W)DHA*7?R$KaFTx8@Ek`0#2N}ecyBb}AZ}FQ zu=iW;9fTOeJ`zx1I1K&iGu&ky=yno-fI;mJ{IOTlukuW>#~K3+6D9-gu#tbjbcA_i z0{4Y?-k)t9A%sNUz6eRYVc)7hBO{Y%2aAVq_e+NhJ6`xJ?bV1-6G}z*mxLeN{r&XJ z`1k{K$@o}qXg)Rk2v+#KL(KRXR9bnMo~}L3$qG>r-Y}m}$+nmmeu2yQfNMF;$uyo9 zKH_@cx955{wf{fG0(QH)J!k z-9I;6xZa1q|GoYcu06f*HWIm7qz6n3--0As5~iN}Nq$S~oMqDoP|A|aTomfW)ygD7 zolaP0B3R;?v79ssvP1Kz!Cz!V3T9-Bb;#B;_)nytnNMJvi!Qx!15uuU%D;L`mmeoE zcXNJ4ZKyHr@&10h7X@!n*=AQefEE;=wplxXjOUhAkx)+6i=JS!!BpW@Yd-GN{=!%) zB|a^WHkCu{_m-R}hrfS5@^`$$Epi9NKl4U4|euJ$Kt_dAzpgO-3!RLX7+2Os|+;v&7zk z0~2mz(?QaVsnNq6WQ!ZV3qf`)9v648hsxwsi{u5Mi@Zexq6OC?p@m%~C+!itxi?d$ zxiZ=21=4HtNUPF;iX~{7@`bC4c6RjynU+HPdOYJhp+dVx)AG#*IWO(dX@YZI_Th_J z#IbM!@=V4kTwMG=vt68DN`g?}UHS#tfeJH&*Y;!}yW2>0ZR^ME0kH~AdL&%UtqNW2 z*wrq(cH&T?L?P*3eH8mBya?R%b-AggJt>sfM8^*+lDXm=|FV$S&ABrMinB+zB&b@bd_4n z?p~R%AgC8!hYPVoHBqag4E{-^-K;!~b*jg6{tF?=Jjly}jpX<71sLuO#b$yEHiRR>!Gh^0Wex{P!U0m&Yu~UD z53#?5=JM8I{o(Jf+JXCoG1N3GzUS1fhLl~>3QCkj6ZYas{c0ht6oXZR7SFBvw~BHZ z^A%3K=it%=^^p;yA|Rd+MzR@hwA6t6U%dqpH$}^y8XX#>XU3)YKuB-AtB^p73-4HS z#6Or%=jWS%c0LZRs>C0-i|LFUi_>|fTQ&u1Y!?i%g6+^GSsvhg&=K8|pd_iP!gIQm z@h7p5L;O+5xcPYGf+ed|g4Caio`cjm4y9c3T$9`rZ2IP%W5DLAza5Wi(v8mjZ_8WyGAF-Bg*(p{*E1JQAu*rUq10c7{s1L#7;Oqp?hdmXQQ#HwWBYX zKP7LAk94J;`~npI{ry})?_fB#l$yNg%xOr9hW?U;(z(PyPZAg)YSo-`Ms z?_O60@Cj_y`1J|JAq)5Y83AS4%x+7d()H--{K?1b^bMFJJY%>1=gN>vQ}FSv!1nyL zZhIDp%ITACL45@_AHi>f^gIeXn363D*Hqftsitg^m5DZmN%4yZZIX?YB6HV2`ME$o zcg???{A|KP0%zK|JkFFwMy-(;*k)s*piZ=(V`DU}1{wSrk7Nt;Ji@h)eLCmg8#@8(rKgYY`>2*m++d20 z0(fPKS}wq;ruSdf@*vhqiUErb>yqGcDKpz zRkkoz#pK;JItn^yFDcR2?5uRUP;a@`-~64FxB>ha_ro&1(q?gYIX+L%vOdL`I@xGB zzMYz)K1bk2Inlg5G|ll%81}1z`Gc^hc+iPRBDINbt{2A(V9R+Xl=Xh&pZa0e^Fsxp zfD&oHYXU8*+rbnH8%WZ`0uX1H2!QzH<@?V6-3}>S!jAetn^wdsKm@9=1#QaL0{1}= z0sxGEH!NxWZ~`C;7p`ot4*j0aF172fX$M=_$K^*}_A5>N5+-$fSFpZDbRTG)2U|Qi_uW?_W7}3*N7SWwIFd; zN3`UmiNpF?{tF9UgiwDjO*&$P7#^TAXc}06?!a-^C<6ruFI|j?RK!u7W|&%xyLOep zAk7Hn$Y)6{)Az+(RyivF0E4ehRgcEKq|nLfI<%O#LF zq0JI$NYKoh^UhY5@wM6en_L5%TsVCLl;up=`UVxpxPD){dc$=c&LcJC7d8uYUiK;+ zK|a3+6o>F^5`!}AY%7fHY`5N{N#T(O?){D~(vOf6jIcc}Yf@kG^cqf^`wb~217=eL zg9s;)HIeI`j{AF?pG}_kp!}m}f4P7J4i`c6;>89FfRUvYI34LEhXNghqE7`^xou+3(le?S7kv>*Z2c3zc zbDG)lH|{7pC_G?T!Y2wRot>2M<*TZ9KwEM3wK?u3Q*Z+`xr94X+ zqoiB?y<6MBhwea;hRaL^=?y(PXduc~d&{0!o5=c2b=9NDFGy7_OX&|4aAKf-P+pQz zsQ3HT?KiTP!8j#hNs^Ka7N$d@xc-Qy&WcNP`3AVL6d}DU8*QQacUT5ESydMLjqX%N z*NZd5%ml5AP*uH)nUCV4RiY^)tzTvslJ((fyB}hwl|=W=0>b4^uAeX0lV2sVY&8wi zh+XuXftzb3LlrufOZP&@z-YlJ8+e?ltb0eE_rJ6hIR=96i(2iYC!@%xOy|A^kLb(s z8FU4YI1k!R7q5%QNaQ33e-}1bp$pELh<|KhO^6eae2Vb|HjIjYn8NVPmW=Fmfm;?P z7o-)8&GxaL(qm<4q(^8g<+BiD7kJa?_#%^~V zkb*}LTk36tpl!x9OH&o_>`P%sk(pqZkm=UUcl`d~XB>2^@~9Fk%G&03f1+ocedOG4 zVw!Nv+Rt_AzR4BTYuq|}1BWHAJwF*WK|dLoR?CZagExx@sVIn_B%HgLf1W$xFYj|y4_mLkn(d{Go6%)xv1<>fk8Yf?Y#|+Yh+iBt zZp}9_P%S(p?kzDXe1L5ulU{_u)VZGC!irCseN&Z_4bbt%1%9$t>518-e4|cb*)#Kk zOE#gu|DEZaN^36m9z0idDxKq5bDvRUSiSz%1&s1OY-~~z^y=@>9kn@bc$MLseUF?` z*CoE2GQ8Q-z3#YSZ=9e|NkQIAw-k-F)qKDw!um;OT35GGdg^d}-5##Eq|m5zH(A`k zfwY$P#J6q#2?U>9Z${b3Srcj^ar;<&xBg28+_=7ZrN~y5E-RU9Sn1wk{*$*lBox!z z*j*Q|fh)Z>{YSqr!zT0l+qb_PPVt1?Wt0jmr|Rq;Dvj7PMR|)ZMO>KC9?5kx>H`Na zj}3Z}WKq28yRK9ty8u+x#dqv{o&01zxdh1v>9nJ-9YE2jq%;`>?uLmmEz06!>?<6d z6^sY@7;KCLisJ4)i`n=S22qLgX9*pP!!@JByQZ&%fp*%5b4OjzOrAMD$}!{Q^RZ6# zq?R`?{g-K(ajBYmmd_Am-mO!u?2*IwgM8+R+I(&AOLB}%TY3R}Et ziIQ@%eL%Sy$pmOQwpaF`5N!H9ykv5OU7I+^xe!q#Z;dYBmk!9~Q| zi4KeUL7$5Qq4k51-&E~}(XcvGWdoyY+E=<6?y!KP9y-HmYlOIHa+E#>FJg9o_?s<_ z9&qAny8dud=?%I0V5t^{Hxhk_SFXkQ>_x|3VkJg{kTE#K=E2pzv(gGYNlI&w z9Lb?jZN`Sm2*|HTVXP=_I|Jy+++XVgdWi6`9ozj0qN$2D%FN=an|wye<&ujh0^ub? zjOxbIkiUAx;~hmMJC07h)wuhtdM2)H1A!T-BPfO^IvUd*zxM_CdReT_+HA8a)v{t6 z(S*^$0}kB%R$j93SL$7mf1eMbxe%M$#vm=`$=+l0$ktee>dQ@BLHscMvCz5V+r10E zpCC18I>9-#(Y~3VQO9|9i&H``)ob*0Due%X1(fJ4z`h`BWuI$GT=$!+bKhv%DUgFw z4+ag&3&!}~?}u%-=->tM&*!(nb8zlpyQj7SsmxBJo}^F?o!~bNHeb#|KxT1(ys;_b>&msjQYnV7z`W5 zq&5S~kK}eSvbt_%vI~w#0s6^PCU-jQpg|@p*i>Kq)fnBe#3qhHi;w{A9-zRGg}4j> zBfc`>a{Q*w-cIox+M(`|UX1&YGUGihqtE?>FQ6)HalZbYi#t_^f4?F*Oz^}M{udvY`MZi#A(85LKKIei`OKkRoqpXKczKGZez-=hj&$m?*iVm3~^1TcLI!w!L8y$9Q`4xjQqk zxc>6)W#55z@#5n7Z_JuB$w{griH^%-p>EBk2QuTC&J$1}Ul01%C~#ked$DdAhX+7t zuJ4@lEc1*FEDKmy z*(o?^1OEu5s;q%WzwbAmH)S-kUfN%ZUb0pp>U6u;HOscMrn$)wET6sUJam}F!RyF^ zlEO`TcgFY^0^=mID8o2N?J>C{Se;rtWD?z@h9%%lL^fh+Rm}J%2AJI=3=j5j+$w=_ zN=~etgM$lsU?e3mWq~{zr)5xbPRI?v_1r1@s%WAnVwm*NU&@Tm4HLiSb}TnHHAMh7 zTdrR@Sl`~gf29_w;w}%9zI(u|#NW#+DDc=u))t0805R!(Y5OwB1!&0y>)7R%jDxu) zJye6q+>kBg(TXvR715dpZe^VXHq2$wk}-|t@ZdNlwbX*CByUXhhBT-otyX&na69XG zD2cIAY=xcu@Mk)zc+qkdsZbZ%I>4()q1b&?(@_p7FlbMlD%#%3>V+Cy=k+*L2__wHq1Og4Bcdwm z=^MA?IyxX7G+_+30#d%CFjPV^w~!fJ4Vv0p_N96vRnj}yBwUya9zZa{-wnh321js) z#72yJ7gd8 zSVzKUuEU>K4P`u(dt2ZTNk|!*_RM;#O<5Q0Ds^k|N5K-}a(EH^I5+UUDO)m{oEiMl z3{;C^$iMfPSaVkt+{3Vz`N?^s`3gpj0JK%K zocqsZ(K*w<>~IYC^?W+#?~@d#HTis(0l<>uCCQvY+uCHGqJQ006!`6Y@&YKaq$k^c zI(;!Ir+!uvUK*^_6ViRu8`g8JvrV8sTDwHohhPM_ICeTY5;;3wI^Bd^OJoej3z&b* z4k|92)-|~5UJMMd(zx4P{`QD*E2p+;Piq>u`;p1)UxH=C)2BJ4+WaM%h_?v{!ABXT zQF3CIMOtRO!Q&aBZK*(q$RBACSh0&TT6gZabbK+;;24>NA}j zIcN%Bb7@t`ZP4tvLR9lZVEPI7uyuGubd;c1!Tr0EOWmKkIyGUb)HE_Hqr?mxE%PkU z|8x8*`K0os)j2&$S`8Ro82-P&cDerkIH8ko1r>?K81+v0;W~ zEJ_7>>u4N=1kMCE90F`ur1USF5J6L?80HB0blw2di?Yq4tlwN*SLJ5jFN$;H>e55d z)O87oFT`w~fIfG!jZsUeKR0;2lvLDQG?_hrOJcRIg~cf&Y#_Sbs3ab;h7tEhNd{Uqx6EmCQ2s^D%) zSWSahru&;oecUPq6)+qjRlUhob-mmCZVKT1I1uHYS8pgMDK8Nx5vycuDqd>R*A@aw zVS9vN`#Qs`)~_1gX5E;9?`b^MALj}%{IM5S+AgMY=VzRZ3sTPZ`dcq5!&}`S(PpUo z=QW)lVJQaQSVa^$3%(x=+B z(UHDC-rnHw0%iH$ed5O&f$RYG)Y<*7f-pW>~4J`F-c7 zstMq5+3g%{VtI(fak+|3BWD}F@6Ws;9;LLBtdfk99LrQoJA{_QRF}S0-qp@8W=iww z=awOshfD}eLOM`<08^?GvAq^yjC8E0o*tRCxs@pcL?g0WU$7m<4EDBN}{j730*7ggaGB z=pxN3ew{M|vO0a4?p&Ex%|5eKAyA{3U6#K7gR0cbZ{vc6Q-AdS!nB+u!Zo>xTpV!) zW_yZUt6}elesy#VTZw7jonV0I{C0lngAkV$hO%}M>$o^h zYIl|@jIQ0MDBZ>@B)zg~9qen?9ZYgp&=SmE8?=o+{5GoQr?;HX+sPh?@9npeucMwp zC!;+C^v7xZU7up*MPatWnr02}MMiJMLDT7K5T8-7D2q0W;K!L&<&XAsYXZ?ao`|E} zWP{~;zqpc}|Mcxkg&Dz#OzJ?Uqaw*#w+EOofnz4$pgGAoAG=kbf9SZ*#Cdg>h2-bV zv|*RSMy;r4i&ERu@;n2p`2L3N5icS17J>UFklpQSeEG^dCG$9=yD{&rBbWZ0$47Zx zLG{F=w3MOXI%l25UQaIbX7M-^zPrL?<4>IT$V;92eZzTyN#7mH4cv|mnGuma zV7+QyRcQjwxWb*6Hk2L|_b97pONU{ynY+~R1dA@#@A@%2^&=8FN`ZFDUX&&DD^(NE zpJy*(^i-Ow!S|%sh4(#@U+g*?+nuCF356?(WwW6Pg$%}&)c666Cxp6@kqeqD_AJ_* z2lAPv^+AN=A_)8)b?k7ei!R2e(aS%Ea?2w>u%)ihG3T#(|T@Qx(UlVN6eUcLM@Wu_Hng#?-QUiC@I;V9RXD1{u4!ayMfM{8Tb@ zWSaC5tnVIVhNq*oVtw8hoUhf#V{IBuH%l((5{_9d+sYy&lSV5lIqFjHMlaCR6K3rS zRrgTnXVkHf3|Q!}nOUScnH{hefc2{>0wmL-p4i%s<#lB|{vq4BzED@p6g09vQ?MJP z+dgUeyiLA_blsOUwamXRtUe@9XFVSyv^Exhb0NFfSPW_f=!Jbms&DklXK^1c)HYDa zM+l<5DZD9^l{JQ%dI^Y16R@ZX7gw8fh+q@*hb^h0VDiPUl~rh{fbo^{@FE=0Ura_+ z^Jhz&W#yVK2ih6SK}&cfRh94lQnJY(%noc#0((wB7Tg!S^rVrOzanqRIpz#72){yw zzJm{@+y1FM-8X5maXpXEA%KhckVpKn z!Qwr8aOnDd&#nx5i7i5Om-6)q*Z4TvT_h#l7hmDn(A~(>^7zS;pFf2JRgp=s7L!&i z=ev(BE!Z3L0yE#_zY$?l6~h0aGpTfmY9U!cBHvW5|4ko4fMmYW^oXj>{skBQgB)@( zfdoF;IrK?EGQ7InY-~&*;E|VGA5=ri#R|Gun0VNEL0~BedDQ(stwFsxS^lf{f5stY zWe(I+Nay&PG1U3;OKrZUu zwFx3`IBJezpESvleo!+y%Qyn3W&Fa??t!JQ9!h4b^M|{8z@)6A;8xuMa1qc5Ff_W? zZpmJ+VBO})cmGvi4iOPF{jiaiVlN?+Z?`UUt!cmNHEB37Y=Y`>5Z#8BFtF+h@x6q3 zWNaY^evBGO7pn7dPa?C3vRBbS#y9TcntnG-r;27hOmQn-C=lC7L8rlokwyOUOXQV7 z*&T5pDxFWu_OLt2;pdUJGyq6>8N(*{tM2Q*F9$X)*1nlQLYx<)jNgteD}cn0n9G%* zqE+Xd8h;sA8ZWezV~gwiSB!7FA7E4FY5xCE!2ecrO_9?g#Q!&w+;c@pn1W(N#Erqq z{eQvEDc~lA7%7ZygorI3Mnpe}K#|Ckq7qC|Des({zRzYDGs49=>Iia zn*bsK0#@$-g?Hxp$A)T(l0P9%%4;+cT+40%Q8WxBD@eBfU$ah+AgaLxi9!F<>c6O8 zkTh~$J|Q(YTS`bIQ5v}>sV<1H=V1Y9MzgYjLiPWW+2#2+&8!tg1O*NO(w_%)#!ewE z2Dvmgnuw2v6~u0X4E%plW6-Df|1-+j0s@?Gs6eyh`uFUR8;Dv`dc!~-U(5qZH2+Kc z7gPt{NYoB$^glH7Q6mutcnYL3;eUHXp_zz}fR*QeA)Nn_HU@dbsgMu{>HpREWn*Il zWe4~dAk4IYb9rmudy1;}I_*kbhM!cN31HLkk-NL!2XJFPD@#jZy5yi?x@DcVG2`Ed0eLK~NB%VBT>E}Z#@UZ{lcyzi*M7zu^6aAE_%1Y@M>ptk zNWIZ!0>}*i8cVu)P$dG!s`eRvse_q6QI?zj`Zh!}z!r*D7kx4skHo-+3xZx}33a$+ zdHZ3VRw^<{>JSatRfW;ZCCH(;q{vX2#7r>5`;;lqA}VR%9!0H7fh1$n;xjB9gg+$; zW)V3MCc)3iM)F`tnDHN_Xi=FV5A(@2I{+L{q8-*&G{H<1FF$-mx@ic^^F;NxU40>~ zgT-jYh%vXpUOp?P*%}cTCFOG6rh3w#=0fnp&2nvL>{5!GbJGK|1$&FMF{9%3b)XoD zPUi?|$huNdNDzIEfao^CZHmF|NXo({QC7;QR`9_wK^urPU%KFwEzwKRV)k>Vep-?0 z)r7WF-x<4Ev8@c$;-Ik&{6F{HF(=S95wtRY_>&)(X>XX^8rA(;;=yLBwaM=8cvK_ngI-UdM#7f8E zOlj-~?Ia4f15sRZj(5**C%WJ51Fm6UBhHjh3;MyP4w;x>qG5cXc)(>~LuZ=8dMQP+ijK543l%eDvan z$Ynw{W*#MZlF zxC$6&_8juQ&rES#7>~H$@U$zl2Rj^zyZ6B#Af8Dmx}q%Q3m0U}C>^X2fer`D_Cns0 z0&5Kf9g3W5*Pv3jsRKLlUz{g`7N5ww>|HzvCicHeU5Ly51{2(`?@`_Qg2H$MVffLc z46j%0KI!H{Ll8V*!LxhW%u`88z8}2*i!-Ii6E}*_fjHEUU*{|m9X>7Y$8z- zkr5SFL?Y>&d<>&oms}xhpBJy>x+D}bw* zUu+iLAiWHEy|%Q$djU?3TD_Zxep2vE#G|~zM-A2M&xz0clo;m{+4?QUKMg~ERXI$K zp!JW3Au-Z3(lXI8j7$@7IEvVR`tkZUG_bMH&D)jvs>UaH>3UOr9mw#Ol6-=NLuP~i z;&I-H&z&U3lmHkYya2F7POzD4;sP(out3T6XsM|qGc)MOa_{2&;oHFj>q%lwxxd}a zBE}9kicYjqo2*&MuLq@SnaW6ws>FpdB=q``&zo8Giz5I;nWs6D@Gh1;1b;2(qkc$0 zQ%g~77?0dlPjjp|g^-PB3pRDpR*+-N*=mfi%i}fOmC7tIX!?Kium8is$pPFa_GMvC zCD!iDFjguiUtL?>sT>3CV2E046z9xp4Ta?)3Ng0x^fT?wvqgV3ml{W$j0?-iww=!{ zkAyY67glO#*AeWmE@YECSC1rIfj7$QGupD9yE(EX36vO>zvC0nQsL6KLk{#esUf40^W=WSU0^n#3Ch#%%G$W95$T#Y^7n$C`NgB`H`;WU@H(%9I`HY4ROo8?iP0h;;^=>?Oh-SrT3tm&zFxeNAOoWK>gVpn`{2*g4p zDV(IcmR9?QbGD1p{57|f&CDd(G4m0d@{vMlO6xRuz)gX_RHK{VZPc^f9U zWPAXgaC3AcHWY6CF3<>|6pDav#q^QbXysL(hxtlIhJUaZDY{^K+5<G+`;@HIK026zA3Ge!5##T{li#}Rr_Jl0(OqOLH>rK={cA?fQ7A6jOpkWg02u^P*) zV|+^3okmIj1DF`)5;b2y-g{ffopCc4XhC40!_nBNAN0%E+Q}LrC@nhjq5g=pRb$N_ zYj25deA~E)Q*y#ilk-9wCok&%7DuwN)&Ih2qkH)K;W8z*cUdJkS zMb8HGsadzC2FvAY8Zjddks+6r^+74Zd#Tah^*55#Q_70#YHB)_-3D(ru~9rUIQPt` zwlhEw3gc{$>^)MI`tNi-y(}gb5|$PwZqUPBY3hIR)sR8We`pvdg-)Y~4v(AM7XM4W z@eS!aBoc6BTbM-g;(q+X9F1~*Zr0q#aA`#)ri`0|Um*d33@>dweM6z{ttZ%t6vaSH z=8L(wWD&;ziXvG9n+;_II>6w2pxh$Xm)d4nbsSOQl9+E-(&9F~B#~k^o+IyiIA~?q z1eMC8m-X4dNZ-OW9w_(Y5Rwyl0{Tx z7bqyx0=d3fr6b#iV5Td{LZn=l@AxI{yqvzn!?Hf2+b5&LW4ExB>MI>d_C}49km7OR!Q`Y zJUkTt-w6;Pt%Kr0-H4AL#E0Rzzs zv;lk3M)-V5)XBhFP+nHjEwlk-Q9GOgF3}FgaM1jVNt@yKkVNg!1}sE7n8FnTSAaC( z%TRR&s5S5=S)>MN13ID|4B?!C992B-scqLr8f@S+0D;fH}%=mQObT6E!5 zfm#gVl7Svls0h$?BB=LJteU7UP^`MB4N$D&sPoXQ3aDz(tlFqQ15+u(BLY)N!*2s| zsl)36aVf%Q150rRXhav_@-P)lq2!Wzd7wQ9GgHXu_dH z2N1{=QL#k_;K`*>X9HOf@-6AntRp5&zV$PRQNi}2u_NqW;PJdd#Nejw@&M6l5qiX; zOUN$106F@daQp-IA$S}}r7eUu1W~T0!uEZ@f;b!-!STTu*h`AORu%qCTaRDDnwgp~ zv1nO#`#uqjou=!~&mM!fj!pn}Z2EFv-4B%4uaHlBAM`6m zi?lP%w)rVL5jw8aKD2O%mKG)vq~Pg0o%%d>5FP;eI-u`iy9KAl=&1+zeOpb&!i+Os{Rd} zJ5CfTa1ER*NfgR^U@eNJ@s&B{DKbrrQ9a9j05AGOOO)rDI!6Y8q3x7D1uJ?_d{VI~ zSy4~v0dNPj(_9ulAQurOHmj{kodUlD98|m#<}?5f%4=e$ z%!yoTURiTr0R*()b06@F9up0U8e`_@6PHxI(&q31%qm`Sb2b2GWgSUtsv@k!?2^XJ zIhVv_6&st`KhR#ubE*J28ph(r@HzHGY*nxHIS9Z#?PLK*${Zn}fp#*VBVi5^Fi)#c zz>zeE2}q#j1gfS>oYDf262GdZi&zU3IVBFM;)`2z6nOy(Xckq1nQMv1ws~0+|B2KiPGNFT-ov zU3#aJYm(W_PK-{FH4lOp;S<>>vP0@!t~J(ao@t5ch+5b*YMNzQgP=xW59onBhFm6- z2Pl2XcRAJ=r!Nwm32=h;`Qy_Rg#7@1vhlHIC)s1T6P^rCWTmG|89vhArl_MCp&6kV zp}S34NtSl)8pNG&j&PYE6Tlm={Nf!Bt!0!0a6gNV?|VTWQLT6Ck-KJZn7XXT!OD z7xoc!@|%7f6&^1)7Jty8SmuGi>V(K)Sy3?6t~DD~VZz4nSXW*<8L`xt{o9TTg{9Pmo5 zmfCf>@4&*nZUB1yQq-#lIqvH^GGd(4MU|Yh3ms|jcx}7kxcu^iy(eEfVgc`$la0?S zA5B)aE7VI2%Rj!I9yx4!i9bY#trzE|KAR8{^8URtPcQDKi`A?(%lhx%$A4d8pZ?u- zT=Ub{xQ}PzbI|8Cvt$J=5g!9J&TyFmkK5<$5P&)#RvE>=Q72yPaugQ0zPMmAJ z(@fJQ=Y^;Frpc#Q12zL1Aq|iN);09BH~~*EB5)FH38IALfcO9@vd0wi6hH=}q#Zy?11Z0C^# z`VmUcAcL}Y81d3@GZcW zY{X%vJwTZtK)6IWM(`xy2!;d>!tL{N<}BItS81L@^eA4CB?eFvR0$^tPUrFF9NDy2 zsX53wXhk3_6x0yP0N?Xa^Hb($vK6vVpW%+7SEU#sD+pjY&qM&Izf!6m6Cj&`IFr$w zVLL?;LX`rM)9(7++4k#---p9|nl)f&UHL?4+b6fMfsE6ZvBxO0IrOHYG)v>dTy$d> z6u2S>3|vm7MO}b?9MMVnDuIa%(Jmgm?Y&z!BkrH7<%%SfJ9#kla%J4t;RQT=seczg}ClU8bhVgR&gncl4a}8a-8v^Q%vKTO=V_T0j!b+h zQWcuXqfN4~jtRNxA}Vp-ev%_8aXTi|0LIO^8zL}+iek2qc#xj+f~_Ly_fzBS^5)6n zdI_7ZD#InKSBAdzS6aG_`g-r1@-W+@%9Mv5N*3wJHq2`+Zq3jP2vzddH z#_lB#>)6H+DPXm>$!v!2DmG!@#mdlRxGcx?K@NQD&E|k%v7m;fm-JY)+?g;2eJnE7 ze7jj5shkT2s#ci|xizwF(l z+&i5Q18AHiqQ*{RZTepuuze2f{K+U|mH{8>+`~spdq~R2q7NH{M`rmS8p_NSo`-i? z;@h=?pMC_68HzRt#9OQ|#S1k?*f#j)_h-m``s^?`Axo_sTqI{|zD$35K5Uj*h|t^K z;_81l!)h3}e=7WO0FS#OJ%XhnJyDIrncKhPSzKGHBmVLODUE)Cn4f_yj?lq-hB-DU zBW8iRe&--<8UN9adtq$S8aG^)0xMzatF_%zGf%Dp93SikIb(oVb^O*y;7#gSmd=L3XIDd5lW%hJJg}kEZ2{ggq&sGP`%>8Rzam}l}_8e)NawdOQz-=w6sB_(&?injXM z+_!=P1M_Y+c~jI~ERe5aY#Hi*p;y>f3uj;ZLa|MJHri#UQ+ z*L@kQ?3VR|8@-s3gKO#qdS^Xchsz}iIUE$Qx=S4=Yh&gQeg{tac&U`L9E-*%oCaY6#lS&}vGn+ueEb?oOsv7F{~rZUyD> z{!THVKScnc!W=%ga~dahn`)fi4t01gy)BL@8G%pX$q#1z7C7h0B!UUdMsHq*cf!hL zuZmDh2i)_GnhfQR+gaP|m7Lt7NZupRrFu!VguJ_#_gYvWra)P-u9v@A&H9}2;ndff z{ab?U=M>0fWu8u=ZV$!Ga0V(qpz7wiE{l``9vWG#Dmt>!j<1gw%D_W5ma9M6$qt~h z%|{P=;~C^=>KHz}YC<~st4b4#sE)>_ECk@#ITN|DK!apTgvF;Q1`nFdEb zD}YV5`(~+z><0(>`zN1JNU%JTG5#{ir1--E%R=pA{B%fM7EE843Ni}Tj9f9%MUg8hhdGVK-z#7*zNzO(Dv?4zCt{^_^_RpTxMzFwmS zcNSHmqd;c8T;|t*{xrRA%PnyBxIk;mwrJ|HZ7$l`i_JZQhox40W{U624DT6byx*`n z#^Ag(51$fD4>4h}&2V*>St#AVM6=q(D0yAu=Qq#NE>qQuSG;K-Kxaese52Qg@`A%k!yb;x{zLHU6Z>Jd!{QL^(k+N-SZCy@Fv`8<1nw04Y z%o5rIz3se0dDS-fH6Dt!T?wDM6tE+&y@DK zCUS)~o@Qx?kEgkIB62gx^`puNw(-<{FB<6n#d=xTW+eYiv`Aa?hyBQ>Z?5sJW!UfT z%Q01{=0f;QN5cizl*%y&-?OMhlfov(opQCJK!9|n@>xV1gS+3O1XK3dSBo@rROfn4 zKR>(nLCLbpSn-*xW_X*7N3w8l?e)-|Zo6rdYIj3aI7x`W7!c-QP)`_{np_ePXmM-Cj7?hp}>iaVV6w zEyBga$NPg5nb&qUBIwoUXnTk9+h6iW0?3`svrBRa6?B1C1Gd0US9G1ESYEvFw{~ke z<@_Fck+eZtGab!dK@l?tLdsw ziJ;kNi^F(-DB8b$xoOKE_iNH;#9OFQ+EeYqOX=sx81ep;VY3MNk7npK>dd^sXT53{6EmWlC2#1nc&dK@ zE>KDgd$y7(9p_izd3ZL*+_!zUTjR;o=D7NFwBu@CxnHxpx@)xooqsK=T^9oJ6Yj$Hs;AS(=2G1)%?suID)|heCUn1SFAhsB z(f>HNp;B)=5tCJSmdV4Q+9Fj8(?j>B<~Q)NO~u}D!y!=N$4-3*8=rs9hWVsd+70&y zk=h6Gi*OxSBt;x+bd|>=Z$?t)mAI$aE*uGYcnY;-F zg#@eC#UCqhj!(bYF*c!OuYVxkwB<<-vz9n-^0I zfgZ6+U(L$kLJ4#E_`>4?eH*vEj$`C~nzBNBn{(ZZ*>}eE0kAxmyU+J?f7-{qR8fs4 zAZhhASI1=Knkg<9owA4(k^P$I*zi3<#|1FaRrQlx|5Z2Y@V4(+{A#wLa1w``Z@7>* zwO^vNiQ0q0cca|2v#OJ2`0`5F@W<*Z%ccg~p#;(K_mNYwy|uw;>w!EI73&~Z%}Y*2 z!?joeb?hj0=9M2$_>rx3)lYDK?`0lwGH>ScZE_<{{W56aQ*dD2(%@CMpEvL5x7-AD z#aYx(Zs>Tws2Qim7U+rZybewoAG7p=cv6T+8>JXaPTxbfqHZY!#?zP2G@EN&xiTDv zo8l;ezyDs=wmSO#u~RxSe{>JpO-Nr{n0g~oI|qz6e28uHt-K>{_GQ^l;P-~x!;0&9 z6f#0Nkmux*3IPMJPijh^!ZvaTvc%c}noJV2Y4$J9UVvYGYZ*ivdeSQL=dWGegwVKk z;a8`up1yBR&5SqQ4MmB_#3c%4+hs_0CFu(ZWUgcy9I7e$e{XjP+(TawD|eldIhyupy``b+H&j5|%~PzhI@bkp?baVbs>*9E$Yt*kP~!_H-9OXU8~AWw1K zw{iz^tV7y`>VZhVb=>j&8Klycn{FkXU+V5gtR=N_doL)pvI_j9>5PKWUE!$Ao|wsB zWaB=?)X|oDemq2;vp-nyp-p7vk95FXn@Z`@V*h)kMSe-OvjWeq|2*)s|5UjGFL<9Y zmC-3K%lCjTqkIUq9idYrQRT_T^AVyj+8;>U~i`znGf~mz@pG%q-^8Bs(9p1Ch}A z18WuD>NfnHi<-)>_utrmRA{IFEUQ!P)0(}5XK?_S<_0VYM$qhj@2+^G!SqxqLwyz(V?Rv_4d?vU*BZLpA|@#h06y` zJKeDN!|QU@Uk|+xLXpZN=*)+*7A0fdU?66p8`0^)p#6 zta~NYAFnhpq? z(h>a9MWutj{pv|nEvsBr3^tD%}!eF#hD-*8JjW#2BS@@Ei0io__XZm z3AUf&1D6IP{t1_JOARchJ!guBI~t4ev`Kvxt*c3keKK zO|^S#8KNoy>^%N9yXBwf6KVy2Sww236v=0}Et!fW(^KY}6^qqeQ0LNzKG?+%=)R!V z{wa;x`ygu+`i(`>Qp_!`REZx*XZAN0mQYlsI2;udxL=>X-?`G;%Wvi0@S^Qe=vLV^ z)h&*W4XucK>%l#F9f{p84(lelhow~bOEx|ti;Po2_hI82U#wplxcB#tPUXc>?oGIf zCnUFR(B+@*{9(MKkh;vAlO6i9J?q@}>lO8GV-1u^X=aP=?OCfLe%`8=fbi&><~*7^ za(9Xghd*~aua-cIdV{8lTPwQ#GB!2GJ7?ZCTeUx2{rpSbk4-Rc<4d@`&BV^E&0*-} z3N8N4k8tAx7B3c&RcFN=KISj8yb*@o8kXv(YKK+0Ysx*;ha1nms!-Z{)==}V*Zs$x z{gJTfXa!`Ku(MN`6&q)!j|GrecG@LUMQK@tsd{CdW`ic~;{LMj;0I>SeVF0}>$?jp z@ysmVCfuU%xxg>Dbl+Udhj{K>GI3*x!Ls8@9d0REBO`H(WQ@uXc%;d$%o?0M*gy(o z0hpvVg~zUvati8c=|84GfIRCGg~MQK-^eMsg6J`=s`^yzh5$G1?u$~mRA;M6R7+q$ zRdj_xEPL1;n^Ws&q({V7$_u`DQ+dscZceN`kfVV*pUE8foT}J9`}&lBhwABGqmkLg zciNPDl-eZ@BQ^aoagdcj52(+0N@7%v0l^~=w%AsoxM9b-k-%5j6$vm~S;wdw>I*$? zw|rH+NRu9ss7ljf8FjB{#L)G{yRo~tNpzn|m$0SU&P?_7kp%xGci)-fi`@mM%MEz9 z)2k6uQ^OaaO))Cczolvo#uV|fhDCZ}0xmU*XXC?4^$RVOXlKC|#IO0Q!j>2Z57=Vu z7^LEs&yI?XZBa+|X^8{uYIgc>J^VV`U{$u( zAt^E0WnPxywpk(Sbv8J+;M85dq~|gy*CbV$4_Bp_!kaBqLt17YMff1tLiv@LxPsXc zxHRhC(>gk5PIg7JyS$4p+kFQKdi?0%l7&GAHnUoKoo``-#xQKuwOi0L%N5cP=!jpK z$KnbG4D4YNyPLT=CvKL;ZLe?JE!Mt1u3x!AS&r!(o0xlXjz{wCOcPW( zv$_y4(kUJ?dnv3~e|`Duq{aGEUOKCW$21I&nBev>VBytnKAYoqM&l!qby`kqJv_W!IbE6ODF4*IIqa6>Kjq*2A zA0HZw&I%93di)0Ra3fqF#V1;Y>kIz2UAreqegA{*X<8W49ld#6AqL3c zOO8+}H4*4}-u?zabvCMM4Dc6soAw;6RJKGoW`bAIPdbknMO7mwBGMZV5cUbK_bV0{ zx@Q7I>a+t;J_>2`E0fgi=BUFmR8D8y$74I5bnj=^L)+lR8g~_NOBv0X_mXh_ygSVb ztKGbA#~k;dzv+5}Y?GSCMACg|Fzk~i0(`0!?LxD!rA7hg87b}1LgssY)dDZs%|qc6r}G63;AjQ&0mDu4SqdTQ^=6s^oy%- zxWaudl9S_;eX2)i!0Ws3G?b0A77y0-1M-_|mJ#bd$vJi^wxjO*K~9qtp_!E{)ZN** z0=>BM#Pg%?<&0lh@nU6AbDtBB8~xfWbku!D5eN zvHwbwyDxkL?>6s(*cr-tCC;EeKcN{O6g>6)Wh1bM*yD%a%6#7K#VuVq4o$KEzH~)) z2|q7Ta@!ed`cj(+qvjau9$L#i|3HzRaBfw_Uu6$`WC#CJRxJ!RI+v*`*W_3u-BU~T zfH6So9xy)Bqt^s^)yKF?3(3=^_F+c)AH_fLAafIsEmCK3F^zx{XrnhdX_|-v9ASu2Mhe{w<%Bn5z?+f|A@tn|-rc2Z7gO zrM>2}Qgb~zHNjKsL1iJ+D&1YPttlSXlYtYN0LthpG*e8jnB+XlKy(Zr3|&vHepln# z#XF77cte4t?H+sGr>Fa~UnPlhYrVC^Fie-cpB)N$bM8Lxr<>g;HiN3JMSOu3@>YtP zZ|7YND{&1KSI0I(8JA_PS>= zb+!O6{aEM9_>URvPMg9-qprqpVTx4Nf^U9N`1n@J8(%!n-C(V2nX9~gC6?ve3(kw& zKkh1{PM1%}E3<`walyXr_>RT5_%m?Y!($fbVpSuSBKLu&M@rlEZVe{`}RK*e95s zvs}99+w=_4`n~IdcZJdEmJivP2BQa6J*vtuo$-bKT~!c?DV5mP5hlBVKB9b@#L z0T&4hpZFPi+CTiT%m2~DU)CM`h7ep52&J8EeVo78!Zae8(c!`6ud&o}~CP zBOqt3+^r!ce9eZk=W*uYb^mF?eG1KO?)L(yA;TA&mTMbLQVNMe$uA8=w7&7jF>Np( z=pWlUr^aFWdGU?@x16|3tXF#M4Y>s)y9M7YpD7 z@8hC(wZnaXY<;15){oKRs|uxMYh$YtlMigAe=jL#;o!piUhCf(g!gad<^L3r z02b2~fZJOyB|TD_qgI6?ZyV`9z#2H*sVvJdti14)_M1t%v@2hQf3fQ|^LFaeehH4f z5UHE8<>-CoIKV{2!y|c9?k)0a)+w(p>{d!6@PJ{#xxZd)em8LavbvYqh*;WVo@Kt| z=mgol%Zi?!_xqkT%H5e53YuzYM@#wD-3FRmb=@^r_*tJeXlwt{aa%I`EzjS7k?M<$ zJI!~K$F{twtYKK%Nthu2-FG)`yug=M6-YbVm((WSv}n? zdn0@_E+H|2w=$Horkh`%^@mev$p?5(v#JJ?=Ww_CT{~>x+Wla`z6;$`5L$<%YiE5c z3HvE3KNTPT{qyP5#bGOx{2wc-)!$M6o-@k)`O)-eO7R>7IXcZV7?*4{1si?s9&X%} z>V606L!S`C!L;G@s69FdH>{zr{5WPBxbS2Cj=raS%T!xNO_j^i4WTXLgNcIz=Ui+= zvENg9hpB`q^si?5$D4Z187l?+eOYPKE0g*13a+mQ!OG~8t%d)`-4joHr3) z*2&DbdgK9(Fr3>s8yXtjxJ8IQtfA4%{8i>#z4@bi9m&R%5>GE@tD&@=_I+f_*5t0( zr<7fLSWnO{*Ik>N-!$rPknYSmZD+^H`8a;$S^ z@Uo2YoqZ%7lMr-7> z&!v#2TJ`X0&*l_tw(N%9&8M}Yd#g65&{{>y2`CgjmOsSw>zHVCu%^4Ear^QU$I1m0 zSGj2B?Zi9BrL;IV73}V1barOB;IDrj1vWoL2=o_-`}`EU)3L3!c>24Vmc&|lgxVeZ zXUWQq7&-W-QA}dxx|?hB)e`u^Rr-3>oi<(as9Bklt6tsm$6Tx1f1Rt+mu zP6Uqs3s-jrj{m1$<)1$F-zK7PHmKfdP=x>D?8?#5MzG)JKgce5`DETjp3_8N7&8Qy zT#SLfP3Bqxv3a2D1wfMH<4^v%wj>^^0P?{ne&%JS{0}b9V)@^V=HsDsT;#C-!s4cN zp+U?r5>y-r{Uq*HkOBb?%h7}83W2&H{=>j9rf1+FcoPXW@qEP+4*qlDKb9640He%S{_< za9tQW`J5qCk_v-Ez(FLfg&`E9h`}Rp;I2TxABb9YI71D7gJZ!j#1^o`kN?q-C^Wc( zBQ!V){BQE8AyoYw$P)z$OY%MrL+sD`#~c^}hQr{o$=XIxX1Sxw!VoAN5(FO}9gf1| zu%H_pVSxt0m)PVSkOe@>9g9N2NQYxV;O$Y#Um{d$0 z4u$Z-f&X|cks+SM`#>5JM#P356%YwZ^A`wU@;^NksvJgFB%euMUwgv5{HK)&j3dm zBEhh7bSK1x(eR_T199~@42YLMIv0gN5_<(75fFt!{6)i{kpG(t{3l?5i-5RclF1nG zn2;`l1y2bn4G%-1kIn^!22b%(PY2QRC={M#E($;(LA@Sb80;ktLVZbSVC=#lRW)%D zB*}RP&nq5{Bb|$eqyC~{;b>yR@_+RIZ-@jLV!&i@M1?3U21BYs6c&g6i-!NpBt!vm z#1#0aNzkw(VHhCBYZw}aMv@*eGy+XbCVx%_8KS|@BQ$U(9R5Fh{$oy%2Ie;sRilXm z|1uMR2IK7!hG1gB{sYPWLuwFW4+?oy7%;(L@qg3sxW8yvJf1|W#EoG8IqpRL|Eqp1 z28Jb(8q5=*>5eW8V)?<$N@8O)@su3h2pFf)D3Tq+FyJ=+4By1{L1{oTiJickC;swu z3>XPXV+96@K$7g3$Pc_sf<&u$Fkq6dfkXkIMUM=GVZc+2J~|l&Hpa&NtwIb2c{EnQ zFc@OUB;f~2NU9lPFe8HfVMPD`H`@^d4au=1?gUSgoQM|;V2L*+5I_Dm7ZjRA{TLir zJdl_PygLDVBzzO~4-)aj8xa0vh=qX>_^4(;VXz3&WP*jG@Yti{U|8Zv5)Fd!7f+JP ziKEZ}sok-l)rmKF91#Y*frNC&STr6_Vmcy2@R|{lxfleTv}g$T%1l51N=n3phBjMm#c($PalmzkvG3fki!u3c)*AKxa6r z1#mJP1$Kx3Q!_+{7}Vc1>|gwFIMPT6&INY@9CeU?h{U@e{!l;I!yc@;j`|0Y28WXh z2)YbddXvlrFO4A80v-Vtp#K^7Z~X@{MBquB3#8#d)sQj-kMUo^;4vgemRN#=4}dT560uk`iTc58Kw7ne<8a8o@&gpi|JHwCE&u;{iUDf_ zQYQqDCz|9ag4GaM!IAg^SRo-uYC>YwL|W>>0W1oPqNM6VVK9H$4)s@1A!bS>lEk^N zDDZiVbjM&(awO^zAJM?L1^Nsz{{3GVC8k-@vklVl_`ja-Ku`EfXbcQ2DM?g~fq~CD zBs4I`{;y2`Z~X_RSx`Ns1HsaO)Pq5>NlyeADoE=9Vv7FT`*A1~Nfivo0ywZHB=vq! zJ|yYFcras;Iu{;HSVyBCc)Jc5T1nIoy6<034bt$$Bg^!s`oYWwx>9oe9Vj;zhNhO% xadf-~{=@)ecSeU=O3lH>@eH`!KUeU$-m`GI_s?TFF&}~fg<4Qh>54M-{{ymQC5He2 From bc921a73724ebccb86cf8769725c8db00bfd3a74 Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 21 Jul 2023 13:33:00 +0900 Subject: [PATCH 09/33] deployed to optimism, polygon, arbitrum --- .../DeployKernel.s.sol/10/run-1689775171.json | 101 +++++++++ .../DeployKernel.s.sol/10/run-1689775178.json | 146 +++++++++++++ .../DeployKernel.s.sol/10/run-latest.json | 146 +++++++++++++ .../137/run-1689775103.json | 101 +++++++++ .../137/run-1689775110.json | 197 ++++++++++++++++++ .../DeployKernel.s.sol/137/run-latest.json | 197 ++++++++++++++++++ .../42161/run-1689775225.json | 146 +++++++++++++ .../DeployKernel.s.sol/42161/run-latest.json | 146 +++++++++++++ scripts/DeployKernel.s.sol | 12 +- 9 files changed, 1186 insertions(+), 6 deletions(-) create mode 100644 broadcast/DeployKernel.s.sol/10/run-1689775171.json create mode 100644 broadcast/DeployKernel.s.sol/10/run-1689775178.json create mode 100644 broadcast/DeployKernel.s.sol/10/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/137/run-1689775103.json create mode 100644 broadcast/DeployKernel.s.sol/137/run-1689775110.json create mode 100644 broadcast/DeployKernel.s.sol/137/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/42161/run-1689775225.json create mode 100644 broadcast/DeployKernel.s.sol/42161/run-latest.json diff --git a/broadcast/DeployKernel.s.sol/10/run-1689775171.json b/broadcast/DeployKernel.s.sol/10/run-1689775171.json new file mode 100644 index 00000000..bc69d7e8 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10/run-1689775171.json @@ -0,0 +1,101 @@ +{ + "transactions": [ + { + "hash": "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x2" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", + "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", + "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3" + ], + "returns": {}, + "timestamp": 1689775171, + "chain": 10, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10/run-1689775178.json b/broadcast/DeployKernel.s.sol/10/run-1689775178.json new file mode 100644 index 00000000..e5b42c74 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10/run-1689775178.json @@ -0,0 +1,146 @@ +{ + "transactions": [ + { + "hash": "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x2" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", + "transactionIndex": "0x8", + "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", + "blockNumber": "0x6620946", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x5c3993", + "gasUsed": "0x3f6e5d", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x787" + }, + { + "transactionHash": "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", + "transactionIndex": "0x9", + "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", + "blockNumber": "0x6620946", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x641eda", + "gasUsed": "0x7e547", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x787" + }, + { + "transactionHash": "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3", + "transactionIndex": "0xa", + "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", + "blockNumber": "0x6620946", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x67f669", + "gasUsed": "0x3d78f", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x787" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689775178, + "chain": 10, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10/run-latest.json b/broadcast/DeployKernel.s.sol/10/run-latest.json new file mode 100644 index 00000000..e5b42c74 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10/run-latest.json @@ -0,0 +1,146 @@ +{ + "transactions": [ + { + "hash": "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x2" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", + "transactionIndex": "0x8", + "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", + "blockNumber": "0x6620946", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x5c3993", + "gasUsed": "0x3f6e5d", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x787" + }, + { + "transactionHash": "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", + "transactionIndex": "0x9", + "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", + "blockNumber": "0x6620946", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x641eda", + "gasUsed": "0x7e547", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x787" + }, + { + "transactionHash": "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3", + "transactionIndex": "0xa", + "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", + "blockNumber": "0x6620946", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x67f669", + "gasUsed": "0x3d78f", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x787" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689775178, + "chain": 10, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/137/run-1689775103.json b/broadcast/DeployKernel.s.sol/137/run-1689775103.json new file mode 100644 index 00000000..698ebe55 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/137/run-1689775103.json @@ -0,0 +1,101 @@ +{ + "transactions": [ + { + "hash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x19" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x1a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1b" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e" + ], + "returns": {}, + "timestamp": 1689775103, + "chain": 137, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/137/run-1689775110.json b/broadcast/DeployKernel.s.sol/137/run-1689775110.json new file mode 100644 index 00000000..42fd9830 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/137/run-1689775110.json @@ -0,0 +1,197 @@ +{ + "transactions": [ + { + "hash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x19" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x1a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1b" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "transactionIndex": "0x36", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xbdaa0b", + "gasUsed": "0x3f6e5d", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x00000000000000000000000000000000000000000000000001e904f9a9a1ff80000000000000000000000000000000000000000000000017451a7931b4f48dff0000000000000000000000000000000000000000000005508352d4c416444aa0000000000000000000000000000000000000000000000017433174380b528e7f000000000000000000000000000000000000000000000550853bd9bdbfe64a20", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "transactionHash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "transactionIndex": "0x36", + "logIndex": "0xd9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x1daefb699c" + }, + { + "transactionHash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "transactionIndex": "0x37", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xc58f52", + "gasUsed": "0x7e547", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x000000000000000000000000000000000000000000000000003cdef3c58606800000000000000000000000000000000000000000000000173dbf9d5a1eda2853000000000000000000000000000000000000000000000550853bd9bdbfe64a200000000000000000000000000000000000000000000000173d82be66595421d30000000000000000000000000000000000000000000005508578b8b1856c50a0", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "transactionHash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "transactionIndex": "0x37", + "logIndex": "0xda", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x1daefb699c" + }, + { + "transactionHash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "transactionIndex": "0x39", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xca3a5e", + "gasUsed": "0x3d78f", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x000000000000000000000000000000000000000000000000001d9eb411f292800000000000000000000000000000000000000000000000173cd53eb7ce63520f000000000000000000000000000000000000000000000550857f1727459a80200000000000000000000000000000000000000000000000173cb7a003bc70bf8f000000000000000000000000000000000000000000000550859cb5db578d12a0", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "transactionHash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "transactionIndex": "0x39", + "logIndex": "0xdc", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x1daefb699c" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689775110, + "chain": 137, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/137/run-latest.json b/broadcast/DeployKernel.s.sol/137/run-latest.json new file mode 100644 index 00000000..42fd9830 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/137/run-latest.json @@ -0,0 +1,197 @@ +{ + "transactions": [ + { + "hash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x579d3c", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x19" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0xae7e3", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x1a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x54e89", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1b" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "transactionIndex": "0x36", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xbdaa0b", + "gasUsed": "0x3f6e5d", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x00000000000000000000000000000000000000000000000001e904f9a9a1ff80000000000000000000000000000000000000000000000017451a7931b4f48dff0000000000000000000000000000000000000000000005508352d4c416444aa0000000000000000000000000000000000000000000000017433174380b528e7f000000000000000000000000000000000000000000000550853bd9bdbfe64a20", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "transactionHash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", + "transactionIndex": "0x36", + "logIndex": "0xd9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x1daefb699c" + }, + { + "transactionHash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "transactionIndex": "0x37", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xc58f52", + "gasUsed": "0x7e547", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x000000000000000000000000000000000000000000000000003cdef3c58606800000000000000000000000000000000000000000000000173dbf9d5a1eda2853000000000000000000000000000000000000000000000550853bd9bdbfe64a200000000000000000000000000000000000000000000000173d82be66595421d30000000000000000000000000000000000000000000005508578b8b1856c50a0", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "transactionHash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", + "transactionIndex": "0x37", + "logIndex": "0xda", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x1daefb699c" + }, + { + "transactionHash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "transactionIndex": "0x39", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xca3a5e", + "gasUsed": "0x3d78f", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x000000000000000000000000000000000000000000000000001d9eb411f292800000000000000000000000000000000000000000000000173cd53eb7ce63520f000000000000000000000000000000000000000000000550857f1727459a80200000000000000000000000000000000000000000000000173cb7a003bc70bf8f000000000000000000000000000000000000000000000550859cb5db578d12a0", + "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", + "blockNumber": "0x2b2b83e", + "transactionHash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "transactionIndex": "0x39", + "logIndex": "0xdc", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x1daefb699c" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689775110, + "chain": 137, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/42161/run-1689775225.json b/broadcast/DeployKernel.s.sol/42161/run-1689775225.json new file mode 100644 index 00000000..b298386a --- /dev/null +++ b/broadcast/DeployKernel.s.sol/42161/run-1689775225.json @@ -0,0 +1,146 @@ +{ + "transactions": [ + { + "hash": "0x35be988ef20d7b2c3d5ce60fd428a3df7f28a9a2eb632443436b943b77247907", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x2e0f95b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xecfe7d83900b6e8dde0c911bbbd07a64a28485b998be927fbe20dc9a246c0af2", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x79237e", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x7" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xa389bc1915140b56b3bb51321d39ab6c70821a8a7e648d0eecb5e80757696048", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x48783b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x8" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x35be988ef20d7b2c3d5ce60fd428a3df7f28a9a2eb632443436b943b77247907", + "transactionIndex": "0x3", + "blockHash": "0x85eae4d51e47387d9a033d205a3f3bc49edeb92822c73e872e599630966f79c1", + "blockNumber": "0x6b97ab8", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x21ffa48", + "gasUsed": "0x2024944", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xecfe7d83900b6e8dde0c911bbbd07a64a28485b998be927fbe20dc9a246c0af2", + "transactionIndex": "0x3", + "blockHash": "0x3ef3416c8cb57caf4c5bf4d9c40107b60ec3edff35c00ee636ad1a2ccbae383d", + "blockNumber": "0x6b97adb", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x6a3bf2", + "gasUsed": "0x52ef19", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xa389bc1915140b56b3bb51321d39ab6c70821a8a7e648d0eecb5e80757696048", + "transactionIndex": "0x3", + "blockHash": "0x3bc7239d0b5f2097b1e94be8c6f3eb147c6723e732280f60a069902c8e41873e", + "blockNumber": "0x6b97ae3", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x4c9cd7", + "gasUsed": "0x309889", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689775225, + "chain": 42161, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/42161/run-latest.json b/broadcast/DeployKernel.s.sol/42161/run-latest.json new file mode 100644 index 00000000..b298386a --- /dev/null +++ b/broadcast/DeployKernel.s.sol/42161/run-latest.json @@ -0,0 +1,146 @@ +{ + "transactions": [ + { + "hash": "0x35be988ef20d7b2c3d5ce60fd428a3df7f28a9a2eb632443436b943b77247907", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x2e0f95b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", + "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", + "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", + "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xecfe7d83900b6e8dde0c911bbbd07a64a28485b998be927fbe20dc9a246c0af2", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x79237e", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", + "nonce": "0x7" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xa389bc1915140b56b3bb51321d39ab6c70821a8a7e648d0eecb5e80757696048", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x48783b", + "value": "0x0", + "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x8" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", + "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x35be988ef20d7b2c3d5ce60fd428a3df7f28a9a2eb632443436b943b77247907", + "transactionIndex": "0x3", + "blockHash": "0x85eae4d51e47387d9a033d205a3f3bc49edeb92822c73e872e599630966f79c1", + "blockNumber": "0x6b97ab8", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x21ffa48", + "gasUsed": "0x2024944", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xecfe7d83900b6e8dde0c911bbbd07a64a28485b998be927fbe20dc9a246c0af2", + "transactionIndex": "0x3", + "blockHash": "0x3ef3416c8cb57caf4c5bf4d9c40107b60ec3edff35c00ee636ad1a2ccbae383d", + "blockNumber": "0x6b97adb", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x6a3bf2", + "gasUsed": "0x52ef19", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xa389bc1915140b56b3bb51321d39ab6c70821a8a7e648d0eecb5e80757696048", + "transactionIndex": "0x3", + "blockHash": "0x3bc7239d0b5f2097b1e94be8c6f3eb147c6723e732280f60a069902c8e41873e", + "blockNumber": "0x6b97ae3", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x4c9cd7", + "gasUsed": "0x309889", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1689775225, + "chain": 42161, + "multi": false, + "commit": "8f0f478" +} \ No newline at end of file diff --git a/scripts/DeployKernel.s.sol b/scripts/DeployKernel.s.sol index 6937a167..47cb2dc1 100644 --- a/scripts/DeployKernel.s.sol +++ b/scripts/DeployKernel.s.sol @@ -19,14 +19,14 @@ contract DeployKernel is Script { address kernelFactory = address(bytes20(returnData)); console.log("KernelFactory deployed at: %s", kernelFactory); - //bytecode = type(ECDSAValidator).creationCode; - //(success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode)); - //require(success, "Failed to deploy ECDSAValidator"); - //address validator = address(bytes20(returnData)); - //console.log("ECDSAValidator deployed at: %s", validator); + bytecode = type(ECDSAValidator).creationCode; + (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode)); + require(success, "Failed to deploy ECDSAValidator"); + address validator = address(bytes20(returnData)); + console.log("ECDSAValidator deployed at: %s", validator); bytecode = type(ECDSAKernelFactory).creationCode; - (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(kernelFactory), abi.encode(address(0x180D6465F921C7E0DEA0040107D342c87455fFF5)), abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); + (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(kernelFactory), abi.encode(address(validator)), abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); require(success, "Failed to deploy ECDSAKernelFactory"); address ecdsaFactory = address(bytes20(returnData)); console.log("ECDSAKernelFactory deployed at: %s", ecdsaFactory); From 5f8e8f46438e5920eb37d3c7c1e8717f07a213ce Mon Sep 17 00:00:00 2001 From: taek Date: Thu, 10 Aug 2023 00:18:58 +0900 Subject: [PATCH 10/33] V2.1 (#25) * v4.0.0-beta.10 * updator draft * removed temp kernel * create account 142873 * added validCaller * forge fmt * small touch on comments * validCaller changed * test for external call * renamed modifier * removed callcode test * forge fmt * added snapshot * custom errors * using gas() for prepay * removed unused copy * payable for gas optimization * using solady for optimization * forge fmt * cache storage for optimization * admin less erc 1967 optimization * unchecked blocks * validator to payable * using constant for gas optimization * removed return * via-ir for optimization * change in order of ecdsa validator to lower the gas cost * squeezing gas * more squeezing * removed exec * kernel helper in yul * more optimization * updated aa dependency * V2.1 optimize (#20) * factory merged with erc1967 minimal factory * Kernel Storage to abstract the initData setting * only one factory to decrease deployment gas * test cleanup to properly structure the test * removing killswitch test too * KernelLite PoC * files for setting a proper gas report * using memory directly to reduce gas * changed order for validator to reduce gas cost * optimize only * remove kernel lite gas report * internal functions for erc1967factory * change kernel sig order for validUntil and validAfter (#21) * forge fmt * fix: parsing typo and mode(1) * V2.1 session key (#22) * session Key debug done * foundry viaIr setting enabled * forge fmt * V2.1 stake factory (#23) * gas optimization by using memory for validateUserOp * optimization with calldata parsing * stake for factory * stake factory * report * fmt * removed unused file * session key now filters the operation * fix: using proper bytes for parsing operation * script for deploying kernel/kernel factory for v2.1 * script for deploying session key * deployed to all testnet * kilswitch (#24) --- .gas-snapshot | 21 +- .../10200/run-1691520802.json | 102 +++++ .../10200/run-1691520809.json | 193 +++++++++ .../DeployKernel.s.sol/10200/run-latest.json | 193 +++++++++ .../420/run-1691518086.json | 102 +++++ .../420/run-1691518093.json | 193 +++++++++ .../DeployKernel.s.sol/420/run-latest.json | 193 +++++++++ .../421613/run-1691518329.json | 97 +++++ .../421613/run-1691518368.json | 97 +++++ .../421613/run-1691518391.json | 93 ++++ .../421613/run-1691518417.json | 93 ++++ .../421613/run-1691518464.json | 88 ++++ .../421613/run-1691518524.json | 97 +++++ .../421613/run-1691518617.json | 97 +++++ .../421613/run-1691518753.json | 97 +++++ .../421613/run-1691518874.json | 97 +++++ .../421613/run-1691518988.json | 97 +++++ .../421613/run-1691519086.json | 97 +++++ .../421613/run-1691519223.json | 97 +++++ .../421613/run-1691519403.json | 97 +++++ .../421613/run-1691519415.json | 97 +++++ .../421613/run-1691519428.json | 97 +++++ .../421613/run-1691519899.json | 97 +++++ .../421613/run-1691519919.json | 97 +++++ .../421613/run-1691519935.json | 97 +++++ .../421613/run-1691520179.json | 193 +++++++++ .../DeployKernel.s.sol/421613/run-latest.json | 193 +++++++++ .../43113/run-1691520462.json | 97 +++++ .../43113/run-1691520484.json | 97 +++++ .../43113/run-1691520581.json | 100 +++++ .../DeployKernel.s.sol/43113/run-latest.json | 100 +++++ .../DeployKernel.s.sol/5/run-1691517811.json | 98 +++++ .../DeployKernel.s.sol/5/run-1691517818.json | 189 +++++++++ .../DeployKernel.s.sol/5/run-latest.json | 208 ++++++--- .../80001/run-1690749002.json | 122 ++++++ .../80001/run-1690749009.json | 250 +++++++++++ .../80001/run-1691515307.json | 53 +++ .../80001/run-1691515320.json | 132 ++++++ .../80001/run-1691515779.json | 33 ++ .../80001/run-1691515785.json | 111 +++++ .../80001/run-1691517538.json | 33 ++ .../80001/run-1691517545.json | 65 +++ .../DeployKernel.s.sol/80001/run-latest.json | 122 ++---- .../84531/run-1691520712.json | 102 +++++ .../84531/run-1691520719.json | 193 +++++++++ .../DeployKernel.s.sol/84531/run-latest.json | 193 +++++++++ .../10200/run-1691520839.json | 34 ++ .../10200/run-1691520846.json | 49 +++ .../10200/run-latest.json | 49 +++ .../420/run-1691518119.json | 34 ++ .../420/run-1691518126.json | 49 +++ .../420/run-latest.json | 49 +++ .../421613/run-1691520310.json | 49 +++ .../421613/run-latest.json | 49 +++ .../43113/run-1691520636.json | 34 ++ .../43113/run-1691520642.json | 49 +++ .../43113/run-latest.json | 49 +++ .../5/run-1691517851.json | 33 ++ .../5/run-1691517870.json | 48 +++ .../DeploySessionKey.s.sol/5/run-latest.json | 48 +++ .../80001/run-1691516556.json | 33 ++ .../80001/run-1691516563.json | 65 +++ .../80001/run-latest.json | 115 ++--- .../84531/run-1691520676.json | 34 ++ .../84531/run-1691520682.json | 49 +++ .../84531/run-latest.json | 49 +++ bytes | 9 + foundry.toml | 3 + gas/ecdsa/report-lite.txt | 40 ++ gas/ecdsa/report.txt | 39 ++ gas/gas_report.sh | 2 + lib/account-abstraction | 2 +- package.json | 2 +- remappings.txt | 3 +- scripts/DeployKernel.s.sol | 51 ++- scripts/DeploySessionKey.s.sol | 22 +- src/Kernel.sol | 217 ++++++---- src/abstract/KernelStorage.sol | 83 ++-- src/common/Constants.sol | 16 + src/common/Enum.sol | 15 + src/common/Structs.sol | 44 ++ src/executor/KillSwitchAction.sol | 9 +- src/executor/TokenActions.sol | 4 +- src/factory/AdminLessERC1967Factory.sol | 307 ++++++++++++++ src/factory/ECDSAKernelFactory.sol | 27 -- src/factory/EIP1967Proxy.sol | 52 --- src/factory/KernelFactory.sol | 85 ++-- src/factory/MultiECDSAKernelFactory.sol | 87 ---- src/factory/TempKernel.sol | 250 ----------- src/interfaces/IAddressBook.sol | 2 +- src/{ => interfaces}/IKernel.sol | 0 src/{validator => interfaces}/IValidator.sol | 7 +- src/test/TestERC20.sol | 20 + src/test/TestERC721.sol | 18 +- src/test/TestKernel.sol | 14 + src/test/TestValidator.sol | 23 +- src/utils/Exec.sol | 53 --- src/utils/KernelHelper.sol | 36 +- src/validator/ECDSAValidator.sol | 24 +- src/validator/ERC165SessionKeyValidator.sol | 14 +- src/validator/KillSwitchValidator.sol | 33 +- src/validator/MultiECDSAValidator.sol | 16 +- src/validator/SessionKeyOwnedValidator.sol | 32 +- src/validator/SessionKeyValidator.sol | 95 +++++ test/foundry/ERC4337Utils.sol | 33 -- test/foundry/Kernel.t.sol | 181 ++++++++ test/foundry/Kernel.test.sol | 181 -------- ...ecution.test.sol => KernelExecution.t.sol} | 108 +---- ...rnelHelper.test.sol => KernelHelper.t.sol} | 18 +- test/foundry/KernelMultiOwned.test.sol | 157 ------- test/foundry/KillSwitch.t.sol | 188 -------- test/foundry/utils/ERC4337Utils.sol | 115 +++++ .../validator/SessionKeyValidator.t.sol | 400 ++++++++++++++++++ 113 files changed, 7865 insertions(+), 1650 deletions(-) create mode 100644 broadcast/DeployKernel.s.sol/10200/run-1691520802.json create mode 100644 broadcast/DeployKernel.s.sol/10200/run-1691520809.json create mode 100644 broadcast/DeployKernel.s.sol/10200/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/420/run-1691518086.json create mode 100644 broadcast/DeployKernel.s.sol/420/run-1691518093.json create mode 100644 broadcast/DeployKernel.s.sol/420/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518329.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518368.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518391.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518417.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518464.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518524.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518617.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518753.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518874.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691518988.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519086.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519223.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519403.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519415.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519428.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519899.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519919.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691519935.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1691520179.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/43113/run-1691520462.json create mode 100644 broadcast/DeployKernel.s.sol/43113/run-1691520484.json create mode 100644 broadcast/DeployKernel.s.sol/43113/run-1691520581.json create mode 100644 broadcast/DeployKernel.s.sol/43113/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/5/run-1691517811.json create mode 100644 broadcast/DeployKernel.s.sol/5/run-1691517818.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1690749002.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1690749009.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1691515307.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1691515320.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1691515779.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1691515785.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1691517538.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1691517545.json create mode 100644 broadcast/DeployKernel.s.sol/84531/run-1691520712.json create mode 100644 broadcast/DeployKernel.s.sol/84531/run-1691520719.json create mode 100644 broadcast/DeployKernel.s.sol/84531/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/10200/run-1691520839.json create mode 100644 broadcast/DeploySessionKey.s.sol/10200/run-1691520846.json create mode 100644 broadcast/DeploySessionKey.s.sol/10200/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/420/run-1691518119.json create mode 100644 broadcast/DeploySessionKey.s.sol/420/run-1691518126.json create mode 100644 broadcast/DeploySessionKey.s.sol/420/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/421613/run-1691520310.json create mode 100644 broadcast/DeploySessionKey.s.sol/421613/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/43113/run-1691520636.json create mode 100644 broadcast/DeploySessionKey.s.sol/43113/run-1691520642.json create mode 100644 broadcast/DeploySessionKey.s.sol/43113/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/5/run-1691517851.json create mode 100644 broadcast/DeploySessionKey.s.sol/5/run-1691517870.json create mode 100644 broadcast/DeploySessionKey.s.sol/5/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/80001/run-1691516556.json create mode 100644 broadcast/DeploySessionKey.s.sol/80001/run-1691516563.json create mode 100644 broadcast/DeploySessionKey.s.sol/84531/run-1691520676.json create mode 100644 broadcast/DeploySessionKey.s.sol/84531/run-1691520682.json create mode 100644 broadcast/DeploySessionKey.s.sol/84531/run-latest.json create mode 100644 bytes create mode 100644 gas/ecdsa/report-lite.txt create mode 100644 gas/ecdsa/report.txt create mode 100755 gas/gas_report.sh create mode 100644 src/common/Constants.sol create mode 100644 src/common/Enum.sol create mode 100644 src/common/Structs.sol create mode 100644 src/factory/AdminLessERC1967Factory.sol delete mode 100644 src/factory/ECDSAKernelFactory.sol delete mode 100644 src/factory/EIP1967Proxy.sol delete mode 100644 src/factory/MultiECDSAKernelFactory.sol delete mode 100644 src/factory/TempKernel.sol rename src/{ => interfaces}/IKernel.sol (100%) rename src/{validator => interfaces}/IValidator.sol (72%) create mode 100644 src/test/TestERC20.sol create mode 100644 src/test/TestKernel.sol delete mode 100644 src/utils/Exec.sol create mode 100644 src/validator/SessionKeyValidator.sol delete mode 100644 test/foundry/ERC4337Utils.sol create mode 100644 test/foundry/Kernel.t.sol delete mode 100644 test/foundry/Kernel.test.sol rename test/foundry/{KernelExecution.test.sol => KernelExecution.t.sol} (70%) rename test/foundry/{KernelHelper.test.sol => KernelHelper.t.sol} (56%) delete mode 100644 test/foundry/KernelMultiOwned.test.sol delete mode 100644 test/foundry/KillSwitch.t.sol create mode 100644 test/foundry/utils/ERC4337Utils.sol create mode 100644 test/foundry/validator/SessionKeyValidator.t.sol diff --git a/.gas-snapshot b/.gas-snapshot index 4e40ad02..cc7d5bdc 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,2 +1,19 @@ -AccountFactoryTest:testAccountFactory(uint256) (runs: 256, μ: 130276, ~: 130276) -KernelTest:testKernel() (gas: 190) \ No newline at end of file +KernelExecutionTest:test_mode_2() (gas: 593614) +KernelExecutionTest:test_mode_2() (gas: 611256) +KernelExecutionTest:test_mode_2_1() (gas: 589400) +KernelExecutionTest:test_mode_2_erc165() (gas: 2485466) +KernelExecutionTest:test_revert_when_mode_disabled() (gas: 192767) +KernelExecutionTest:test_sudo() (gas: 216219) +KernelHelperTest:testIntersect(uint48,uint48,uint48,uint48) (runs: 256, μ: 2379, ~: 2383) +KernelTest:test_disable_mode() (gas: 170757) +KernelTest:test_disable_mode() (gas: 172824) +KernelTest:test_external_call_default() (gas: 28844) +KernelTest:test_external_call_execution() (gas: 520197) +KernelTest:test_initialize_twice() (gas: 20515) +KernelTest:test_initialize_twice() (gas: 20537) +KernelTest:test_set_default_validator() (gas: 427634) +KernelTest:test_set_default_validator() (gas: 429679) +KernelTest:test_set_execution() (gas: 477930) +KernelTest:test_set_execution() (gas: 479975) +KernelTest:test_validate_signature() (gas: 171911) +KernelTest:test_validate_signature() (gas: 175529) \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10200/run-1691520802.json b/broadcast/DeployKernel.s.sol/10200/run-1691520802.json new file mode 100644 index 00000000..ec8d649d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10200/run-1691520802.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2" + ], + "returns": {}, + "timestamp": 1691520802, + "chain": 10200, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10200/run-1691520809.json b/broadcast/DeployKernel.s.sol/10200/run-1691520809.json new file mode 100644 index 00000000..e032f5ea --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10200/run-1691520809.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "transactionIndex": "0x1", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1af9bb", + "gasUsed": "0x1a96ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionIndex": "0x2", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x251d7c", + "gasUsed": "0xa23c1", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "transactionHash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "transactionIndex": "0x3", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x25d2de", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionIndex": "0x4", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x271747", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "transactionHash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520809, + "chain": 10200, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10200/run-latest.json b/broadcast/DeployKernel.s.sol/10200/run-latest.json new file mode 100644 index 00000000..e032f5ea --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10200/run-latest.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "transactionIndex": "0x1", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1af9bb", + "gasUsed": "0x1a96ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionIndex": "0x2", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x251d7c", + "gasUsed": "0xa23c1", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "transactionHash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "transactionIndex": "0x3", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x25d2de", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionIndex": "0x4", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x271747", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", + "blockNumber": "0x527145", + "transactionHash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520809, + "chain": 10200, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/420/run-1691518086.json b/broadcast/DeployKernel.s.sol/420/run-1691518086.json new file mode 100644 index 00000000..a8f03a99 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/420/run-1691518086.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718" + ], + "returns": {}, + "timestamp": 1691518086, + "chain": 420, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/420/run-1691518093.json b/broadcast/DeployKernel.s.sol/420/run-1691518093.json new file mode 100644 index 00000000..50b0a859 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/420/run-1691518093.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "transactionIndex": "0x1", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b4bde", + "gasUsed": "0x1a94a9", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + }, + { + "transactionHash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionIndex": "0x2", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x256eeb", + "gasUsed": "0xa230d", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "transactionHash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + }, + { + "transactionHash": "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "transactionIndex": "0x3", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x26244d", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + }, + { + "transactionHash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionIndex": "0x4", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x2768b6", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "transactionHash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518093, + "chain": 420, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/420/run-latest.json b/broadcast/DeployKernel.s.sol/420/run-latest.json new file mode 100644 index 00000000..50b0a859 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/420/run-latest.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "transactionIndex": "0x1", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b4bde", + "gasUsed": "0x1a94a9", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + }, + { + "transactionHash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionIndex": "0x2", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x256eeb", + "gasUsed": "0xa230d", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "transactionHash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + }, + { + "transactionHash": "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "transactionIndex": "0x3", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x26244d", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + }, + { + "transactionHash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionIndex": "0x4", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x2768b6", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", + "blockNumber": "0xc70d12", + "transactionHash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518093, + "chain": 420, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518329.json b/broadcast/DeployKernel.s.sol/421613/run-1691518329.json new file mode 100644 index 00000000..2b248ed6 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518329.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518329, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518368.json b/broadcast/DeployKernel.s.sol/421613/run-1691518368.json new file mode 100644 index 00000000..cdc0f5b8 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518368.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518368, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518391.json b/broadcast/DeployKernel.s.sol/421613/run-1691518391.json new file mode 100644 index 00000000..593bf1ff --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518391.json @@ -0,0 +1,93 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518391, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518417.json b/broadcast/DeployKernel.s.sol/421613/run-1691518417.json new file mode 100644 index 00000000..0390ee34 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518417.json @@ -0,0 +1,93 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518417, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518464.json b/broadcast/DeployKernel.s.sol/421613/run-1691518464.json new file mode 100644 index 00000000..6dba200d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518464.json @@ -0,0 +1,88 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": null, + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518464, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518524.json b/broadcast/DeployKernel.s.sol/421613/run-1691518524.json new file mode 100644 index 00000000..93156e1f --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518524.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518524, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518617.json b/broadcast/DeployKernel.s.sol/421613/run-1691518617.json new file mode 100644 index 00000000..84489817 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518617.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518617, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518753.json b/broadcast/DeployKernel.s.sol/421613/run-1691518753.json new file mode 100644 index 00000000..c1eea2d9 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518753.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518753, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518874.json b/broadcast/DeployKernel.s.sol/421613/run-1691518874.json new file mode 100644 index 00000000..3daad3b2 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518874.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518874, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691518988.json b/broadcast/DeployKernel.s.sol/421613/run-1691518988.json new file mode 100644 index 00000000..752f59d8 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691518988.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518988, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519086.json b/broadcast/DeployKernel.s.sol/421613/run-1691519086.json new file mode 100644 index 00000000..9ad5f0c2 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519086.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519086, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519223.json b/broadcast/DeployKernel.s.sol/421613/run-1691519223.json new file mode 100644 index 00000000..632e14e8 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519223.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519223, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519403.json b/broadcast/DeployKernel.s.sol/421613/run-1691519403.json new file mode 100644 index 00000000..30cfe4ec --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519403.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519403, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519415.json b/broadcast/DeployKernel.s.sol/421613/run-1691519415.json new file mode 100644 index 00000000..7ab3b946 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519415.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519415, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519428.json b/broadcast/DeployKernel.s.sol/421613/run-1691519428.json new file mode 100644 index 00000000..2008db1e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519428.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519428, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519899.json b/broadcast/DeployKernel.s.sol/421613/run-1691519899.json new file mode 100644 index 00000000..8e8a11db --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519899.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519899, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519919.json b/broadcast/DeployKernel.s.sol/421613/run-1691519919.json new file mode 100644 index 00000000..7c3e2e5b --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519919.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519919, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691519935.json b/broadcast/DeployKernel.s.sol/421613/run-1691519935.json new file mode 100644 index 00000000..9caeed0a --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691519935.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691519935, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1691520179.json b/broadcast/DeployKernel.s.sol/421613/run-1691520179.json new file mode 100644 index 00000000..d180505e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1691520179.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0xf278fddf310414c9528e8943472cddd5c5c184899d2c723ff041eeb92087a9a9", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x18984d32c69870fa6295c17667808fa383db21267de046102eceb8e5950d2bb0", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf278fddf310414c9528e8943472cddd5c5c184899d2c723ff041eeb92087a9a9", + "transactionIndex": "0x1", + "blockHash": "0x088cff90920683955173731b8b2e8fb971cd2899f41f6ad228a4ee05c5fab1d1", + "blockNumber": "0x1feac3c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1a94a9", + "gasUsed": "0x1a94a9", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x8d6b4c6f0" + }, + { + "transactionHash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "transactionIndex": "0x1", + "blockHash": "0x1e5b5bd2885d86b564b3a959832b4659dbf3c1bf2af6bd0ac92717586a4808ee", + "blockNumber": "0x1feac4a", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa230d", + "gasUsed": "0xa230d", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x1e5b5bd2885d86b564b3a959832b4659dbf3c1bf2af6bd0ac92717586a4808ee", + "blockNumber": "0x1feac4a", + "transactionHash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0x88b417060" + }, + { + "transactionHash": "0x18984d32c69870fa6295c17667808fa383db21267de046102eceb8e5950d2bb0", + "transactionIndex": "0x1", + "blockHash": "0x28b742fed42b1ce7e2a33fdd5c4ea49115e282fd0d80dee2ccd2f6c0de2e4a8e", + "blockNumber": "0x1feac4d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0xb562", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x886071730" + }, + { + "transactionHash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "transactionIndex": "0x1", + "blockHash": "0x2c7e2365eb70c09c2ad6cbffc89af0bfc9bca976d686e4efc1176dbd69f90796", + "blockNumber": "0x1feac56", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x14469", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x2c7e2365eb70c09c2ad6cbffc89af0bfc9bca976d686e4efc1176dbd69f90796", + "blockNumber": "0x1feac56", + "transactionHash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x844a655d0" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520179, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-latest.json b/broadcast/DeployKernel.s.sol/421613/run-latest.json new file mode 100644 index 00000000..d180505e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-latest.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0xf278fddf310414c9528e8943472cddd5c5c184899d2c723ff041eeb92087a9a9", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x230bb7", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xd5ae0", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x18984d32c69870fa6295c17667808fa383db21267de046102eceb8e5950d2bb0", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf278fddf310414c9528e8943472cddd5c5c184899d2c723ff041eeb92087a9a9", + "transactionIndex": "0x1", + "blockHash": "0x088cff90920683955173731b8b2e8fb971cd2899f41f6ad228a4ee05c5fab1d1", + "blockNumber": "0x1feac3c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1a94a9", + "gasUsed": "0x1a94a9", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x8d6b4c6f0" + }, + { + "transactionHash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "transactionIndex": "0x1", + "blockHash": "0x1e5b5bd2885d86b564b3a959832b4659dbf3c1bf2af6bd0ac92717586a4808ee", + "blockNumber": "0x1feac4a", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa230d", + "gasUsed": "0xa230d", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x1e5b5bd2885d86b564b3a959832b4659dbf3c1bf2af6bd0ac92717586a4808ee", + "blockNumber": "0x1feac4a", + "transactionHash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0x88b417060" + }, + { + "transactionHash": "0x18984d32c69870fa6295c17667808fa383db21267de046102eceb8e5950d2bb0", + "transactionIndex": "0x1", + "blockHash": "0x28b742fed42b1ce7e2a33fdd5c4ea49115e282fd0d80dee2ccd2f6c0de2e4a8e", + "blockNumber": "0x1feac4d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0xb562", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x886071730" + }, + { + "transactionHash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "transactionIndex": "0x1", + "blockHash": "0x2c7e2365eb70c09c2ad6cbffc89af0bfc9bca976d686e4efc1176dbd69f90796", + "blockNumber": "0x1feac56", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x14469", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x2c7e2365eb70c09c2ad6cbffc89af0bfc9bca976d686e4efc1176dbd69f90796", + "blockNumber": "0x1feac56", + "transactionHash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x844a655d0" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520179, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43113/run-1691520462.json b/broadcast/DeployKernel.s.sol/43113/run-1691520462.json new file mode 100644 index 00000000..6c8202aa --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43113/run-1691520462.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520462, + "chain": 43113, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43113/run-1691520484.json b/broadcast/DeployKernel.s.sol/43113/run-1691520484.json new file mode 100644 index 00000000..b296b962 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43113/run-1691520484.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520484, + "chain": 43113, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43113/run-1691520581.json b/broadcast/DeployKernel.s.sol/43113/run-1691520581.json new file mode 100644 index 00000000..ada7a51d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43113/run-1691520581.json @@ -0,0 +1,100 @@ +{ + "transactions": [ + { + "hash": "0xd0b1ffa7799070e830d79d01c8b2735ccdb69ac52ab7bab244ced7493799f3ba", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x18bc42e511afc2bed20c0a346eb354420ef3d67a27e1e9646388f88afe9d031c", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xd0b1ffa7799070e830d79d01c8b2735ccdb69ac52ab7bab244ced7493799f3ba", + "0x18bc42e511afc2bed20c0a346eb354420ef3d67a27e1e9646388f88afe9d031c" + ], + "returns": {}, + "timestamp": 1691520581, + "chain": 43113, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43113/run-latest.json b/broadcast/DeployKernel.s.sol/43113/run-latest.json new file mode 100644 index 00000000..ada7a51d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43113/run-latest.json @@ -0,0 +1,100 @@ +{ + "transactions": [ + { + "hash": "0xd0b1ffa7799070e830d79d01c8b2735ccdb69ac52ab7bab244ced7493799f3ba", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x18bc42e511afc2bed20c0a346eb354420ef3d67a27e1e9646388f88afe9d031c", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xd0b1ffa7799070e830d79d01c8b2735ccdb69ac52ab7bab244ced7493799f3ba", + "0x18bc42e511afc2bed20c0a346eb354420ef3d67a27e1e9646388f88afe9d031c" + ], + "returns": {}, + "timestamp": 1691520581, + "chain": 43113, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-1691517811.json b/broadcast/DeployKernel.s.sol/5/run-1691517811.json new file mode 100644 index 00000000..fb03f4d6 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1691517811.json @@ -0,0 +1,98 @@ +{ + "transactions": [ + { + "hash": "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x41" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x42" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x43" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x44" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", + "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", + "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b" + ], + "returns": {}, + "timestamp": 1691517811, + "chain": 5, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-1691517818.json b/broadcast/DeployKernel.s.sol/5/run-1691517818.json new file mode 100644 index 00000000..aeebb0f2 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1691517818.json @@ -0,0 +1,189 @@ +{ + "transactions": [ + { + "hash": "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x41" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x42" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x43" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x44" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", + "transactionIndex": "0x1b", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fdc8a", + "gasUsed": "0x1a96ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x57779217" + }, + { + "transactionHash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "transactionIndex": "0x1c", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5a004b", + "gasUsed": "0xa23c1", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "transactionHash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "transactionIndex": "0x1c", + "logIndex": "0x3e", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x0", + "effectiveGasPrice": "0x57779217" + }, + { + "transactionHash": "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", + "transactionIndex": "0x1d", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x5ab5ad", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x57779217" + }, + { + "transactionHash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "transactionIndex": "0x1e", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x5bfa16", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "transactionHash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "transactionIndex": "0x1e", + "logIndex": "0x3f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x57779217" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691517818, + "chain": 5, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-latest.json b/broadcast/DeployKernel.s.sol/5/run-latest.json index b4d53375..aeebb0f2 100644 --- a/broadcast/DeployKernel.s.sol/5/run-latest.json +++ b/broadcast/DeployKernel.s.sol/5/run-latest.json @@ -1,107 +1,189 @@ { "transactions": [ { - "hash": "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", "function": null, "arguments": null, "transaction": { - "type": "0x02", + "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x579d3c", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x3f", - "accessList": [] + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x41" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", - "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", - "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", - "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", "function": null, "arguments": null, "transaction": { - "type": "0x02", + "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x54e89", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x40", - "accessList": [] + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x42" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", - "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x43" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x44" + }, + "additionalContracts": [], "isFixedGasLimit": false } ], "receipts": [ { - "transactionHash": "0x0d59631865490e046916ac5f783b8d26c8d412629371f969bd59987d97f4454f", - "transactionIndex": "0x9", - "blockHash": "0x1951b20bed49d1d2b3ad84d56cc44a7c2fd8b619f41d98ffedfedea537c059f0", - "blockNumber": "0x8e6cb6", + "transactionHash": "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", + "transactionIndex": "0x1b", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0xb19848", - "gasUsed": "0x3f7777", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fdc8a", + "gasUsed": "0x1a96ab", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2", - "effectiveGasPrice": "0xbd2a328d" + "type": "0x0", + "effectiveGasPrice": "0x57779217" + }, + { + "transactionHash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "transactionIndex": "0x1c", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5a004b", + "gasUsed": "0xa23c1", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "transactionHash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "transactionIndex": "0x1c", + "logIndex": "0x3e", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x0", + "effectiveGasPrice": "0x57779217" }, { - "transactionHash": "0xc38c17580a4315e1011e34b1e6794507f94808c116ec2b6860794edbe42d0a70", - "transactionIndex": "0xa", - "blockHash": "0x1951b20bed49d1d2b3ad84d56cc44a7c2fd8b619f41d98ffedfedea537c059f0", - "blockNumber": "0x8e6cb6", + "transactionHash": "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", + "transactionIndex": "0x1d", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0xb57027", - "gasUsed": "0x3d7df", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x5ab5ad", + "gasUsed": "0xb562", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2", - "effectiveGasPrice": "0xbd2a328d" + "type": "0x0", + "effectiveGasPrice": "0x57779217" + }, + { + "transactionHash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "transactionIndex": "0x1e", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x5bfa16", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", + "blockNumber": "0x90b80f", + "transactionHash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "transactionIndex": "0x1e", + "logIndex": "0x3f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x57779217" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1689175805, + "timestamp": 1691517818, "chain": 5, "multi": false, - "commit": "ccc01a6" + "commit": "06a62a2" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1690749002.json b/broadcast/DeployKernel.s.sol/80001/run-1690749002.json new file mode 100644 index 00000000..57df86e2 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1690749002.json @@ -0,0 +1,122 @@ +{ + "transactions": [ + { + "hash": "0xbb3a20da81d9d752f3e88c3acf252ba87b63cc472bc224b12c1f2075fb850851", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x7541a", + "value": "0x0", + "data": "0x6080806040523461001657610550908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c806319d9363c146102c55780634c96a3891461024e5780635414dff014610201578063ade809051461014f578063db4c545e146101215763e919e3ea1461006257600080fd5b8060031936011261011d5761007561038b565b602435928360601c80331490151715610112576100906103d4565b9360896013860187f59384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b84903d156100fb57503d81803e3d90fd5b63301164258252601cfd5b5063301164258552601cfd5b632f6348368552601cfd5b8280fd5b83823461014b578160031936011261014b57602090608960136101426103d4565b01209051908152f35b5080fd5b508060031936011261011d5761016361038b565b60243567ffffffffffffffff81116101fd5761018290369085016103a6565b61018d9491946103d4565b9060896013830188f09586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b8363301164258952601cfd5b8480fd5b5082903461014b57602036600319011261014b57602092608960136102246103d4565b012060ff84536035523060601b600152356015526055822091603552519060018060a01b03168152f35b50602036600319011261011d5761026361038b565b61026b6103d4565b9260896013850186f09384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b50606036600319011261011d576102da61038b565b6024359260443567ffffffffffffffff8111610387576102fd90369083016103a6565b8560609692961c8033149015171561037b576103176103d4565b9160896013840189f59586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b82632f6348368852601cfd5b8580fd5b600435906001600160a01b03821682036103a157565b600080fd5b9181601f840112156103a15782359167ffffffffffffffff83116103a157602083818601950101116103a157565b604051903060701c1561047857666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d825256fe09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", + "nonce": "0x39" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x61D48C31C95C7d5a7C567b38061a9fd52E1a3D97", + "initCode": "6080806040523461001657610550908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c806319d9363c146102c55780634c96a3891461024e5780635414dff014610201578063ade809051461014f578063db4c545e146101215763e919e3ea1461006257600080fd5b8060031936011261011d5761007561038b565b602435928360601c80331490151715610112576100906103d4565b9360896013860187f59384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b84903d156100fb57503d81803e3d90fd5b63301164258252601cfd5b5063301164258552601cfd5b632f6348368552601cfd5b8280fd5b83823461014b578160031936011261014b57602090608960136101426103d4565b01209051908152f35b5080fd5b508060031936011261011d5761016361038b565b60243567ffffffffffffffff81116101fd5761018290369085016103a6565b61018d9491946103d4565b9060896013830188f09586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b8363301164258952601cfd5b8480fd5b5082903461014b57602036600319011261014b57602092608960136102246103d4565b012060ff84536035523060601b600152356015526055822091603552519060018060a01b03168152f35b50602036600319011261011d5761026361038b565b61026b6103d4565b9260896013850186f09384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b50606036600319011261011d576102da61038b565b6024359260443567ffffffffffffffff8111610387576102fd90369083016103a6565b8560609692961c8033149015171561037b576103176103d4565b9160896013840189f59586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b82632f6348368852601cfd5b8580fd5b600435906001600160a01b03821682036103a157565b600080fd5b9181601f840112156103a15782359167ffffffffffffffff83116103a157602083818601950101116103a157565b604051903060701c1561047857666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d825256fe09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xf9988164183bf47b6ed3453c83f51fbb0f979c8d65fd927bb2c8a4558b4b9685", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x2bc818", + "value": "0x0", + "data": "0x60e0346100f9576001600160401b0390601f61265638819003918201601f1916830191848311848410176100e35780849260409485528339810103126100f9578051906001600160a01b039081831683036100f95760200151908116918282036100f95760805260c052604051916120ed90818401908111848210176100e3576020928492610569843981520301906000f080156100d75760a05260405161046a90816100ff8239608051818181606c015281816101ee01526102df015260a0518181816101900152610356015260c0518160b30152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040818152600436101561001457600080fd5b600091823560e01c908163037637aa14610342575080631bb12e6914610276578063296601cd146100e2578063b0d691fe1461009f5763f961ea491461005957600080fd5b3461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b503461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6001600160601b0383836100f536610385565b849391945192602097889363347d5e2560e21b8587015260018060a01b039788821660248801528760448801528060648801526101796084948281878b01378b86848b01015261016d601f199761015e888c8b601f8901168101038d606482019052018c6103eb565b8b519485938b85019788610423565b038681018352826103eb565b519020169185519485936306764d8f60e21b8552887f0000000000000000000000000000000000000000000000000000000000000000166004860152602485015260606044850152805190816064860152858a5b83811061025f5750505090601f828a858795860101520116810103018187877f0000000000000000000000000000000000000000000000000000000000000000165af19384156102545793610225575b505191168152f35b610246919350843d861161024d575b61023e81836103eb565b81019061044b565b918461021d565b503d610234565b8251903d90823e3d90fd5b8281018201518982018701528896508791016101cd565b503461009b576001600160601b036102b76102a961029336610385565b8795939594919451948593602085019788610423565b03601f1981018352826103eb565b51902082516305414dff60e41b815291166004820152906001600160a01b03906020836024817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610338576020949361031957505191168152f35b610331919350843d811161024d5761023e81836103eb565b913861021d565b81513d86823e3d90fd5b83903461009b578160031936011261009b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60606003198201126103e6576004356001600160a01b03811681036103e6579160243567ffffffffffffffff928382116103e657806023830112156103e65781600401359384116103e657602484830101116103e657602401919060443590565b600080fd5b90601f8019910116810190811067ffffffffffffffff82111761040d57604052565b634e487b7160e01b600052604160045260246000fd5b90928092603495946001600160601b03199060601b1683526014830137019060148201520190565b908160209103126103e657516001600160a01b03811681036103e657905661014034620001b057601f620020ed38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611f019283620001ec8439608051836119cb015260a051836119ee015260c05183611a60015260e05183611a86015251826119aa0152518181816104b101528181610673015281816107880152818161091501528181610a4c01528181610c6f01528181610d9001528181610ea301528181610fcd01526113f10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b36610fb057005b60003560e01c806306fdde03146101755780630b3dc35414610170578063150b7a021461016b5780631626ba7e1461016657806329f8b174146101615780633659cfe61461015c5780633a871cdd146101575780633e1b08121461015257806351166ba01461014d578063519454471461014857806354fd4d501461014357806355b14f501461013e57806357b750471461013957806384b0196e1461013457806388e7fd061461012f57806394e2c9e31461012a578063b0d691fe14610125578063bc197c8114610120578063d087d2881461011b578063d1f5789414610116578063d5416221146101115763f23a6e610361000e57610f1e565b610e8c565b610ddc565b610d5d565b610cce565b610c59565b610c30565b610bfb565b610b53565b610b1c565b610a36565b6109de565b6108cc565b610803565b61073f565b6106f5565b61064f565b610443565b6103b1565b610357565b6102d4565b6102a0565b600091031261018557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101b357604052565b61018a565b608081019081106001600160401b038211176101b357604052565b604081019081106001600160401b038211176101b357604052565b90601f801991011681019081106001600160401b038211176101b357604052565b6040519061021c826101b8565b565b6040519061016082018281106001600160401b038211176101b357604052565b6040519061024b826101d3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061028c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161026b565b34610185576000366003190112610185576102d06102bc61023e565b604051918291602083526020830190610260565b0390f35b3461018557600036600319011261018557600080516020611ee18339815191525460405160509190911c6001600160a01b03168152602090f35b6001600160a01b0381160361018557565b359061021c8261030e565b9181601f84011215610185578235916001600160401b038311610185576020838186019501011161018557565b346101855760803660031901126101855761037360043561030e565b61037e60243561030e565b6064356001600160401b0381116101855761039d90369060040161032a565b5050604051630a85bd0160e11b8152602090f35b34610185576040366003190112610185576024356001600160401b038111610185576103ef6103e6602092369060040161032a565b90600435611abc565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361018557565b6064359065ffffffffffff8216820361018557565b6084359065ffffffffffff8216820361018557565b60c036600319011261018557610457610402565b602435906104648261030e565b604435906104718261030e565b610479610419565b9261048261042e565b9060a4356001600160401b038111610185576104a290369060040161032a565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610645575b61063357849261050f6105a6926105006104f261020f565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261053687610f78565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610185576040519063064acaab60e11b825281806105d06000998a94600484016112e5565b038183895af1801561062e57610615575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610622610628926101a0565b8061017a565b386105e1565b6112f6565b604051637046c88d60e01b8152600490fd5b50303314156104da565b6020366003190112610185576004356106678161030e565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106eb575b61063357807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561069c565b60031960603682011261018557600435906001600160401b038211610185576101609082360301126101855761073760209160443590602435906004016113e1565b604051908152f35b34610185576020366003190112610185576004356001600160c01b0381169081900361018557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d5575b506040519081529081906020820190565b6107f6915060203d81116107fc575b6107ee81836101ee565b810190611302565b386107c4565b503d6107e4565b34610185576020366003190112610185576102d0610848610822610402565b60006060604051610832816101b8565b8281528260208201528260408201520152610f78565b60405190610855826101b8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b6080366003190112610185576004356108e48161030e565b6044356001600160401b0381116101855761090390369060040161032a565b919060643592600284101561018557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806109a8575b61063357600191610957913691611029565b926109618161106f565b036109875760008281939260208394519201905af43d82803e15610983573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610983573d90f35b506109b86109b4611c7b565b1590565b610945565b604051906109ca826101d3565b6005825264302e322e3160d81b6020830152565b34610185576000366003190112610185576102d06102bc6109bd565b90604060031983011261018557600435610a138161030e565b91602435906001600160401b03821161018557610a329160040161032a565b9091565b610a3f366109fa565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610b12575b6106335780600080516020611ee18339815191525460501c1691610a9881611df4565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b03925af1801561062e57610afe575080f35b80610622610b0b926101a0565b80f35b8380fd5b5030331415610a75565b34610185576000366003190112610185576020600080516020611ee18339815191525460e01b6040519063ffffffff60e01b168152f35b3461018557600036600319011261018557610ba9610b6f61023e565b610b776109bd565b90604051928392600f60f81b8452610b9b60209360e08587015260e0860190610260565b908482036040860152610260565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610be457505050500390f35b835185528695509381019392810192600101610bd5565b34610185576000366003190112610185576020600080516020611ee18339815191525465ffffffffffff60405191831c168152f35b34610185576000366003190112610185576000546040516001600160a01b039091168152602090f35b34610185576000366003190112610185576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610185578235916001600160401b038311610185576020808501948460051b01011161018557565b346101855760a036600319011261018557610cea60043561030e565b610cf560243561030e565b6001600160401b0360443581811161018557610d15903690600401610c9e565b505060643581811161018557610d2f903690600401610c9e565b505060843590811161018557610d4990369060040161032a565b505060405163bc197c8160e01b8152602090f35b3461018557600036600319011261018557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d557506040519081529081906020820190565b610de5366109fa565b600080516020611ee18339815191525490926001600160a01b03918290610e189060501c82165b6001600160a01b031690565b16610e7b57610e2681611df4565b169160405191600093849281847fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8180a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b60405162dc149f60e41b8152600490fd5b602036600319011261018557610ea0610402565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610f14575b61063357600080516020611ee183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610ed3565b346101855760a036600319011261018557610f3a60043561030e565b610f4560243561030e565b6084356001600160401b03811161018557610f6490369060040161032a565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b6000610fc681356001600160e01b031916610f78565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061101a575b61063357818091368280378136915af43d82803e15610983573d90f35b50611023611c7b565b15610ffd565b9291926001600160401b0382116101b35760405191611052601f8201601f1916602001846101ee565b829481845281830111610185578281602093846000960137010152565b6002111561107957565b634e487b7160e01b600052602160045260246000fd5b903590601e198136030182121561018557018035906001600160401b0382116101855760200191813603831361018557565b906004116101855790600490565b906024116101855760100190601490565b909291928360041161018557831161018557600401916003190190565b906058116101855760380190602090565b906024116101855760040190602090565b906038116101855760240190601490565b90600a116101855760040190600690565b9060101161018557600a0190600690565b90939293848311610185578411610185578101920390565b6001600160e01b0319903581811693926004811061118757505050565b60040360031b82901b16169150565b9080601f83011215610185578160206111b193359101611029565b90565b919061016083820312610185576111c961021e565b926111d38161031f565b8452602081013560208501526040810135916001600160401b03928381116101855781611201918401611196565b60408601526060820135838111610185578161121e918401611196565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101855782611270918501611196565b9086015261014092838301359081116101855761128d9201611196565b90830152565b6bffffffffffffffffffffffff1990358181169392601481106112b557505050565b60140360031b82901b16169150565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206111b19381815201916112c4565b6040513d6000823e3d90fd5b90816020910312610185575190565b606080825282516001600160a01b031690820152919392916040916113d7906020810151608084015283810151611356610160918260a08701526101c0860190610260565b906113c4611376606085015193605f1994858983030160c08a0152610260565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610260565b92015190848303016101a0850152610260565b9460208201520152565b6000926001600160a01b039284927f0000000000000000000000000000000000000000000000000000000000000000851633036116d957610140948582019161143c611436611430858461108f565b906110c1565b9061116a565b9663ffffffff60e01b93600080516020611ee18339815191529285611462855460e01b90565b8b16166116c7578a9561147536836111b4565b9a168061152d5750926020979694926114aa6114a361149c6114be956114e39e9a9861108f565b80916110e0565b3691611029565b908701525460501c6001600160a01b031690565b935b8561151f575b604051633a871cdd60e01b81529889968795869360048501611311565b0393165af191821561062e576111b193926114ff575b50611e41565b61151891925060203d81116107fc576107ee81836101ee565b90386114f9565b8280808089335af1506114c6565b9798509296600160e01b81036115d65750916114e398979593916020979593611567611562611436611430606087018761108f565b610f78565b60018101549093906001600160a01b031697858916156115bf575b5061149c611593926114a39261108f565b9089015254607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617966114c0565b5460501c6001600160a01b0316975061149c611582565b919795939650919350600160e11b146000146116ba5761163b90611635611606611436611430606088018861108f565b9161162f610e0c61162961162361161d858b61108f565b906110cf565b90611293565b60601c90565b9561108f565b9161174b565b97939992989190999884871690813b156116b657918c91611676969594938360405180998195829463064acaab60e11b8452600484016112e5565b03925af1801561062e576114e39a6020998d9661169a936116a3575b503691611029565b908201526114c0565b806106226116b0926101a0565b38611692565b8c80fd5b5050505050505050600190565b60405163fc2f51c560e01b8152600490fd5b604051636b31ba1560e11b8152600490fd5b3590602081106116f9575090565b6000199060200360031b1b1690565b6040906111b19492815281602082015201916112c4565b6001600160d01b0319903581811693926006811061173c57505050565b60060360031b82901b16169150565b90929161175881856110fd565b611761916116eb565b9360588101938593607887019384886058019061177f918387611152565b611788916116eb565b611792828661110e565b61179b916116eb565b986117a6838761111f565b6117af91611293565b60601c906117be36828c611029565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198a1692820192909252606081019e909e526001600160a01b039490941660808e015260a0808e01919091528c529a8b929061183660c0826101ee565b519020611842906119a8565b600080516020611ee18339815191525490939060501c6001600160a01b03169101976078890161187391868a611152565b60405163199ed7c960e11b81529485939284928392611896929060048501611708565b03915afa92831561062e576115626118dc61021c956105369460009161198b575b506118d56118c5878b61110e565b6001600160a01b031992916116eb565b1690611e41565b9a61197b8561196b60788c8c01019b607719908303019a611942610e0c61162961162361192b61192561191f6119186116296116238c8b61111f565b9988611130565b9061171f565b60d01c90565b9c61193c61192561191f8389611141565b956110cf565b9461195c61194e61020f565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6119a291508d803d106107fc576107ee81836101ee565b386118b7565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611a35575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611a16565b600080516020611ee18339815191525460405163199ed7c960e11b81526001600160a01b03949093602093859360501c87169284928392611b0292919060048501611708565b03915afa801561062e57611b1e91600091611b8f575b50611bad565b60208101514265ffffffffffff90911611611b805742611b55611b4a604084015165ffffffffffff1690565b65ffffffffffff1690565b10611b8057516001600160a01b031616611b7457630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b0319919050565b611ba7915060203d81116107fc576107ee81836101ee565b38611b18565b604080516001600160401b03929060608101848111828210176101b35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611c22575b83519460608601908111868210176101b35784526001600160a01b038116855260d01c6020850152169082015290565b829150611bf2565b90816020910312610185575180151581036101855790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611ee183398151915254604051639ea9bd5960e01b8082526020926001600160a01b0392908490829060501c85168180611cbf363360048401611c42565b03915afa90811561062e57600091611dd7575b50611dcf57611cec6000356001600160e01b031916610f78565b6001810154611d03906001600160a01b0316610e0c565b92831615908115611d9a575b8115611d7b575b5015611d2457505050600090565b829060405192839182528180611d3e363360048401611c42565b03915afa91821561062e57600092611d5557505090565b6111b19250803d10611d74575b611d6c81836101ee565b810190611c2a565b503d611d62565b5460301c65ffffffffffff16905065ffffffffffff4291161138611d16565b905065ffffffffffff611db3825465ffffffffffff1690565b168015159081611dc5575b5090611d0f565b9050421138611dbe565b505050600190565b611dee9150843d8611611d7457611d6c81836101ee565b38611cd2565b600080516020611ee183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b906001600160a01b03808316919081168203611dcf578260d01c9065ffffffffffff809460a01c16938415611ed8575b808260d01c9260a01c16918215611ecf575b808410611ec7575b5080821690851611611ebf575b5060a09290921b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b925038611e98565b925038611e8b565b91508091611e83565b935083611e7156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd900000000000000000000000061d48c31c95c7d5a7c567b38061a9fd52e1a3d970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x88546cc16eC33FD449fa929Fb8ac900793018784", + "initCode": "60e0346100f9576001600160401b0390601f61265638819003918201601f1916830191848311848410176100e35780849260409485528339810103126100f9578051906001600160a01b039081831683036100f95760200151908116918282036100f95760805260c052604051916120ed90818401908111848210176100e3576020928492610569843981520301906000f080156100d75760a05260405161046a90816100ff8239608051818181606c015281816101ee01526102df015260a0518181816101900152610356015260c0518160b30152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040818152600436101561001457600080fd5b600091823560e01c908163037637aa14610342575080631bb12e6914610276578063296601cd146100e2578063b0d691fe1461009f5763f961ea491461005957600080fd5b3461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b503461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6001600160601b0383836100f536610385565b849391945192602097889363347d5e2560e21b8587015260018060a01b039788821660248801528760448801528060648801526101796084948281878b01378b86848b01015261016d601f199761015e888c8b601f8901168101038d606482019052018c6103eb565b8b519485938b85019788610423565b038681018352826103eb565b519020169185519485936306764d8f60e21b8552887f0000000000000000000000000000000000000000000000000000000000000000166004860152602485015260606044850152805190816064860152858a5b83811061025f5750505090601f828a858795860101520116810103018187877f0000000000000000000000000000000000000000000000000000000000000000165af19384156102545793610225575b505191168152f35b610246919350843d861161024d575b61023e81836103eb565b81019061044b565b918461021d565b503d610234565b8251903d90823e3d90fd5b8281018201518982018701528896508791016101cd565b503461009b576001600160601b036102b76102a961029336610385565b8795939594919451948593602085019788610423565b03601f1981018352826103eb565b51902082516305414dff60e41b815291166004820152906001600160a01b03906020836024817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610338576020949361031957505191168152f35b610331919350843d811161024d5761023e81836103eb565b913861021d565b81513d86823e3d90fd5b83903461009b578160031936011261009b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60606003198201126103e6576004356001600160a01b03811681036103e6579160243567ffffffffffffffff928382116103e657806023830112156103e65781600401359384116103e657602484830101116103e657602401919060443590565b600080fd5b90601f8019910116810190811067ffffffffffffffff82111761040d57604052565b634e487b7160e01b600052604160045260246000fd5b90928092603495946001600160601b03199060601b1683526014830137019060148201520190565b908160209103126103e657516001600160a01b03811681036103e657905661014034620001b057601f620020ed38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611f019283620001ec8439608051836119cb015260a051836119ee015260c05183611a60015260e05183611a86015251826119aa0152518181816104b101528181610673015281816107880152818161091501528181610a4c01528181610c6f01528181610d9001528181610ea301528181610fcd01526113f10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b36610fb057005b60003560e01c806306fdde03146101755780630b3dc35414610170578063150b7a021461016b5780631626ba7e1461016657806329f8b174146101615780633659cfe61461015c5780633a871cdd146101575780633e1b08121461015257806351166ba01461014d578063519454471461014857806354fd4d501461014357806355b14f501461013e57806357b750471461013957806384b0196e1461013457806388e7fd061461012f57806394e2c9e31461012a578063b0d691fe14610125578063bc197c8114610120578063d087d2881461011b578063d1f5789414610116578063d5416221146101115763f23a6e610361000e57610f1e565b610e8c565b610ddc565b610d5d565b610cce565b610c59565b610c30565b610bfb565b610b53565b610b1c565b610a36565b6109de565b6108cc565b610803565b61073f565b6106f5565b61064f565b610443565b6103b1565b610357565b6102d4565b6102a0565b600091031261018557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101b357604052565b61018a565b608081019081106001600160401b038211176101b357604052565b604081019081106001600160401b038211176101b357604052565b90601f801991011681019081106001600160401b038211176101b357604052565b6040519061021c826101b8565b565b6040519061016082018281106001600160401b038211176101b357604052565b6040519061024b826101d3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061028c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161026b565b34610185576000366003190112610185576102d06102bc61023e565b604051918291602083526020830190610260565b0390f35b3461018557600036600319011261018557600080516020611ee18339815191525460405160509190911c6001600160a01b03168152602090f35b6001600160a01b0381160361018557565b359061021c8261030e565b9181601f84011215610185578235916001600160401b038311610185576020838186019501011161018557565b346101855760803660031901126101855761037360043561030e565b61037e60243561030e565b6064356001600160401b0381116101855761039d90369060040161032a565b5050604051630a85bd0160e11b8152602090f35b34610185576040366003190112610185576024356001600160401b038111610185576103ef6103e6602092369060040161032a565b90600435611abc565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361018557565b6064359065ffffffffffff8216820361018557565b6084359065ffffffffffff8216820361018557565b60c036600319011261018557610457610402565b602435906104648261030e565b604435906104718261030e565b610479610419565b9261048261042e565b9060a4356001600160401b038111610185576104a290369060040161032a565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610645575b61063357849261050f6105a6926105006104f261020f565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261053687610f78565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610185576040519063064acaab60e11b825281806105d06000998a94600484016112e5565b038183895af1801561062e57610615575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610622610628926101a0565b8061017a565b386105e1565b6112f6565b604051637046c88d60e01b8152600490fd5b50303314156104da565b6020366003190112610185576004356106678161030e565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106eb575b61063357807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561069c565b60031960603682011261018557600435906001600160401b038211610185576101609082360301126101855761073760209160443590602435906004016113e1565b604051908152f35b34610185576020366003190112610185576004356001600160c01b0381169081900361018557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d5575b506040519081529081906020820190565b6107f6915060203d81116107fc575b6107ee81836101ee565b810190611302565b386107c4565b503d6107e4565b34610185576020366003190112610185576102d0610848610822610402565b60006060604051610832816101b8565b8281528260208201528260408201520152610f78565b60405190610855826101b8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b6080366003190112610185576004356108e48161030e565b6044356001600160401b0381116101855761090390369060040161032a565b919060643592600284101561018557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806109a8575b61063357600191610957913691611029565b926109618161106f565b036109875760008281939260208394519201905af43d82803e15610983573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610983573d90f35b506109b86109b4611c7b565b1590565b610945565b604051906109ca826101d3565b6005825264302e322e3160d81b6020830152565b34610185576000366003190112610185576102d06102bc6109bd565b90604060031983011261018557600435610a138161030e565b91602435906001600160401b03821161018557610a329160040161032a565b9091565b610a3f366109fa565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610b12575b6106335780600080516020611ee18339815191525460501c1691610a9881611df4565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b03925af1801561062e57610afe575080f35b80610622610b0b926101a0565b80f35b8380fd5b5030331415610a75565b34610185576000366003190112610185576020600080516020611ee18339815191525460e01b6040519063ffffffff60e01b168152f35b3461018557600036600319011261018557610ba9610b6f61023e565b610b776109bd565b90604051928392600f60f81b8452610b9b60209360e08587015260e0860190610260565b908482036040860152610260565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610be457505050500390f35b835185528695509381019392810192600101610bd5565b34610185576000366003190112610185576020600080516020611ee18339815191525465ffffffffffff60405191831c168152f35b34610185576000366003190112610185576000546040516001600160a01b039091168152602090f35b34610185576000366003190112610185576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610185578235916001600160401b038311610185576020808501948460051b01011161018557565b346101855760a036600319011261018557610cea60043561030e565b610cf560243561030e565b6001600160401b0360443581811161018557610d15903690600401610c9e565b505060643581811161018557610d2f903690600401610c9e565b505060843590811161018557610d4990369060040161032a565b505060405163bc197c8160e01b8152602090f35b3461018557600036600319011261018557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d557506040519081529081906020820190565b610de5366109fa565b600080516020611ee18339815191525490926001600160a01b03918290610e189060501c82165b6001600160a01b031690565b16610e7b57610e2681611df4565b169160405191600093849281847fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8180a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b60405162dc149f60e41b8152600490fd5b602036600319011261018557610ea0610402565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610f14575b61063357600080516020611ee183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610ed3565b346101855760a036600319011261018557610f3a60043561030e565b610f4560243561030e565b6084356001600160401b03811161018557610f6490369060040161032a565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b6000610fc681356001600160e01b031916610f78565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061101a575b61063357818091368280378136915af43d82803e15610983573d90f35b50611023611c7b565b15610ffd565b9291926001600160401b0382116101b35760405191611052601f8201601f1916602001846101ee565b829481845281830111610185578281602093846000960137010152565b6002111561107957565b634e487b7160e01b600052602160045260246000fd5b903590601e198136030182121561018557018035906001600160401b0382116101855760200191813603831361018557565b906004116101855790600490565b906024116101855760100190601490565b909291928360041161018557831161018557600401916003190190565b906058116101855760380190602090565b906024116101855760040190602090565b906038116101855760240190601490565b90600a116101855760040190600690565b9060101161018557600a0190600690565b90939293848311610185578411610185578101920390565b6001600160e01b0319903581811693926004811061118757505050565b60040360031b82901b16169150565b9080601f83011215610185578160206111b193359101611029565b90565b919061016083820312610185576111c961021e565b926111d38161031f565b8452602081013560208501526040810135916001600160401b03928381116101855781611201918401611196565b60408601526060820135838111610185578161121e918401611196565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101855782611270918501611196565b9086015261014092838301359081116101855761128d9201611196565b90830152565b6bffffffffffffffffffffffff1990358181169392601481106112b557505050565b60140360031b82901b16169150565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206111b19381815201916112c4565b6040513d6000823e3d90fd5b90816020910312610185575190565b606080825282516001600160a01b031690820152919392916040916113d7906020810151608084015283810151611356610160918260a08701526101c0860190610260565b906113c4611376606085015193605f1994858983030160c08a0152610260565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610260565b92015190848303016101a0850152610260565b9460208201520152565b6000926001600160a01b039284927f0000000000000000000000000000000000000000000000000000000000000000851633036116d957610140948582019161143c611436611430858461108f565b906110c1565b9061116a565b9663ffffffff60e01b93600080516020611ee18339815191529285611462855460e01b90565b8b16166116c7578a9561147536836111b4565b9a168061152d5750926020979694926114aa6114a361149c6114be956114e39e9a9861108f565b80916110e0565b3691611029565b908701525460501c6001600160a01b031690565b935b8561151f575b604051633a871cdd60e01b81529889968795869360048501611311565b0393165af191821561062e576111b193926114ff575b50611e41565b61151891925060203d81116107fc576107ee81836101ee565b90386114f9565b8280808089335af1506114c6565b9798509296600160e01b81036115d65750916114e398979593916020979593611567611562611436611430606087018761108f565b610f78565b60018101549093906001600160a01b031697858916156115bf575b5061149c611593926114a39261108f565b9089015254607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617966114c0565b5460501c6001600160a01b0316975061149c611582565b919795939650919350600160e11b146000146116ba5761163b90611635611606611436611430606088018861108f565b9161162f610e0c61162961162361161d858b61108f565b906110cf565b90611293565b60601c90565b9561108f565b9161174b565b97939992989190999884871690813b156116b657918c91611676969594938360405180998195829463064acaab60e11b8452600484016112e5565b03925af1801561062e576114e39a6020998d9661169a936116a3575b503691611029565b908201526114c0565b806106226116b0926101a0565b38611692565b8c80fd5b5050505050505050600190565b60405163fc2f51c560e01b8152600490fd5b604051636b31ba1560e11b8152600490fd5b3590602081106116f9575090565b6000199060200360031b1b1690565b6040906111b19492815281602082015201916112c4565b6001600160d01b0319903581811693926006811061173c57505050565b60060360031b82901b16169150565b90929161175881856110fd565b611761916116eb565b9360588101938593607887019384886058019061177f918387611152565b611788916116eb565b611792828661110e565b61179b916116eb565b986117a6838761111f565b6117af91611293565b60601c906117be36828c611029565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198a1692820192909252606081019e909e526001600160a01b039490941660808e015260a0808e01919091528c529a8b929061183660c0826101ee565b519020611842906119a8565b600080516020611ee18339815191525490939060501c6001600160a01b03169101976078890161187391868a611152565b60405163199ed7c960e11b81529485939284928392611896929060048501611708565b03915afa92831561062e576115626118dc61021c956105369460009161198b575b506118d56118c5878b61110e565b6001600160a01b031992916116eb565b1690611e41565b9a61197b8561196b60788c8c01019b607719908303019a611942610e0c61162961162361192b61192561191f6119186116296116238c8b61111f565b9988611130565b9061171f565b60d01c90565b9c61193c61192561191f8389611141565b956110cf565b9461195c61194e61020f565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6119a291508d803d106107fc576107ee81836101ee565b386118b7565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611a35575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611a16565b600080516020611ee18339815191525460405163199ed7c960e11b81526001600160a01b03949093602093859360501c87169284928392611b0292919060048501611708565b03915afa801561062e57611b1e91600091611b8f575b50611bad565b60208101514265ffffffffffff90911611611b805742611b55611b4a604084015165ffffffffffff1690565b65ffffffffffff1690565b10611b8057516001600160a01b031616611b7457630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b0319919050565b611ba7915060203d81116107fc576107ee81836101ee565b38611b18565b604080516001600160401b03929060608101848111828210176101b35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611c22575b83519460608601908111868210176101b35784526001600160a01b038116855260d01c6020850152169082015290565b829150611bf2565b90816020910312610185575180151581036101855790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611ee183398151915254604051639ea9bd5960e01b8082526020926001600160a01b0392908490829060501c85168180611cbf363360048401611c42565b03915afa90811561062e57600091611dd7575b50611dcf57611cec6000356001600160e01b031916610f78565b6001810154611d03906001600160a01b0316610e0c565b92831615908115611d9a575b8115611d7b575b5015611d2457505050600090565b829060405192839182528180611d3e363360048401611c42565b03915afa91821561062e57600092611d5557505090565b6111b19250803d10611d74575b611d6c81836101ee565b810190611c2a565b503d611d62565b5460301c65ffffffffffff16905065ffffffffffff4291161138611d16565b905065ffffffffffff611db3825465ffffffffffff1690565b168015159081611dc5575b5090611d0f565b9050421138611dbe565b505050600190565b611dee9150843d8611611d7457611d6c81836101ee565b38611cd2565b600080516020611ee183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b906001600160a01b03808316919081168203611dcf578260d01c9065ffffffffffff809460a01c16938415611ed8575b808260d01c9260a01c16918215611ecf575b808410611ec7575b5080821690851611611ebf575b5060a09290921b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b925038611e98565b925038611e8b565b91508091611e83565b935083611e7156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd900000000000000000000000061d48c31c95c7d5a7c567b38061a9fd52e1a3d970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xdf89afDD53c813B645928a66594F2b841Da38BEA", + "initCode": "61014034620001b057601f620020ed38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611f019283620001ec8439608051836119cb015260a051836119ee015260c05183611a60015260e05183611a86015251826119aa0152518181816104b101528181610673015281816107880152818161091501528181610a4c01528181610c6f01528181610d9001528181610ea301528181610fcd01526113f10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b36610fb057005b60003560e01c806306fdde03146101755780630b3dc35414610170578063150b7a021461016b5780631626ba7e1461016657806329f8b174146101615780633659cfe61461015c5780633a871cdd146101575780633e1b08121461015257806351166ba01461014d578063519454471461014857806354fd4d501461014357806355b14f501461013e57806357b750471461013957806384b0196e1461013457806388e7fd061461012f57806394e2c9e31461012a578063b0d691fe14610125578063bc197c8114610120578063d087d2881461011b578063d1f5789414610116578063d5416221146101115763f23a6e610361000e57610f1e565b610e8c565b610ddc565b610d5d565b610cce565b610c59565b610c30565b610bfb565b610b53565b610b1c565b610a36565b6109de565b6108cc565b610803565b61073f565b6106f5565b61064f565b610443565b6103b1565b610357565b6102d4565b6102a0565b600091031261018557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101b357604052565b61018a565b608081019081106001600160401b038211176101b357604052565b604081019081106001600160401b038211176101b357604052565b90601f801991011681019081106001600160401b038211176101b357604052565b6040519061021c826101b8565b565b6040519061016082018281106001600160401b038211176101b357604052565b6040519061024b826101d3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061028c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161026b565b34610185576000366003190112610185576102d06102bc61023e565b604051918291602083526020830190610260565b0390f35b3461018557600036600319011261018557600080516020611ee18339815191525460405160509190911c6001600160a01b03168152602090f35b6001600160a01b0381160361018557565b359061021c8261030e565b9181601f84011215610185578235916001600160401b038311610185576020838186019501011161018557565b346101855760803660031901126101855761037360043561030e565b61037e60243561030e565b6064356001600160401b0381116101855761039d90369060040161032a565b5050604051630a85bd0160e11b8152602090f35b34610185576040366003190112610185576024356001600160401b038111610185576103ef6103e6602092369060040161032a565b90600435611abc565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361018557565b6064359065ffffffffffff8216820361018557565b6084359065ffffffffffff8216820361018557565b60c036600319011261018557610457610402565b602435906104648261030e565b604435906104718261030e565b610479610419565b9261048261042e565b9060a4356001600160401b038111610185576104a290369060040161032a565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610645575b61063357849261050f6105a6926105006104f261020f565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261053687610f78565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610185576040519063064acaab60e11b825281806105d06000998a94600484016112e5565b038183895af1801561062e57610615575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610622610628926101a0565b8061017a565b386105e1565b6112f6565b604051637046c88d60e01b8152600490fd5b50303314156104da565b6020366003190112610185576004356106678161030e565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106eb575b61063357807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561069c565b60031960603682011261018557600435906001600160401b038211610185576101609082360301126101855761073760209160443590602435906004016113e1565b604051908152f35b34610185576020366003190112610185576004356001600160c01b0381169081900361018557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d5575b506040519081529081906020820190565b6107f6915060203d81116107fc575b6107ee81836101ee565b810190611302565b386107c4565b503d6107e4565b34610185576020366003190112610185576102d0610848610822610402565b60006060604051610832816101b8565b8281528260208201528260408201520152610f78565b60405190610855826101b8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b6080366003190112610185576004356108e48161030e565b6044356001600160401b0381116101855761090390369060040161032a565b919060643592600284101561018557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806109a8575b61063357600191610957913691611029565b926109618161106f565b036109875760008281939260208394519201905af43d82803e15610983573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610983573d90f35b506109b86109b4611c7b565b1590565b610945565b604051906109ca826101d3565b6005825264302e322e3160d81b6020830152565b34610185576000366003190112610185576102d06102bc6109bd565b90604060031983011261018557600435610a138161030e565b91602435906001600160401b03821161018557610a329160040161032a565b9091565b610a3f366109fa565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610b12575b6106335780600080516020611ee18339815191525460501c1691610a9881611df4565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b03925af1801561062e57610afe575080f35b80610622610b0b926101a0565b80f35b8380fd5b5030331415610a75565b34610185576000366003190112610185576020600080516020611ee18339815191525460e01b6040519063ffffffff60e01b168152f35b3461018557600036600319011261018557610ba9610b6f61023e565b610b776109bd565b90604051928392600f60f81b8452610b9b60209360e08587015260e0860190610260565b908482036040860152610260565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610be457505050500390f35b835185528695509381019392810192600101610bd5565b34610185576000366003190112610185576020600080516020611ee18339815191525465ffffffffffff60405191831c168152f35b34610185576000366003190112610185576000546040516001600160a01b039091168152602090f35b34610185576000366003190112610185576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610185578235916001600160401b038311610185576020808501948460051b01011161018557565b346101855760a036600319011261018557610cea60043561030e565b610cf560243561030e565b6001600160401b0360443581811161018557610d15903690600401610c9e565b505060643581811161018557610d2f903690600401610c9e565b505060843590811161018557610d4990369060040161032a565b505060405163bc197c8160e01b8152602090f35b3461018557600036600319011261018557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d557506040519081529081906020820190565b610de5366109fa565b600080516020611ee18339815191525490926001600160a01b03918290610e189060501c82165b6001600160a01b031690565b16610e7b57610e2681611df4565b169160405191600093849281847fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8180a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b60405162dc149f60e41b8152600490fd5b602036600319011261018557610ea0610402565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610f14575b61063357600080516020611ee183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610ed3565b346101855760a036600319011261018557610f3a60043561030e565b610f4560243561030e565b6084356001600160401b03811161018557610f6490369060040161032a565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b6000610fc681356001600160e01b031916610f78565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061101a575b61063357818091368280378136915af43d82803e15610983573d90f35b50611023611c7b565b15610ffd565b9291926001600160401b0382116101b35760405191611052601f8201601f1916602001846101ee565b829481845281830111610185578281602093846000960137010152565b6002111561107957565b634e487b7160e01b600052602160045260246000fd5b903590601e198136030182121561018557018035906001600160401b0382116101855760200191813603831361018557565b906004116101855790600490565b906024116101855760100190601490565b909291928360041161018557831161018557600401916003190190565b906058116101855760380190602090565b906024116101855760040190602090565b906038116101855760240190601490565b90600a116101855760040190600690565b9060101161018557600a0190600690565b90939293848311610185578411610185578101920390565b6001600160e01b0319903581811693926004811061118757505050565b60040360031b82901b16169150565b9080601f83011215610185578160206111b193359101611029565b90565b919061016083820312610185576111c961021e565b926111d38161031f565b8452602081013560208501526040810135916001600160401b03928381116101855781611201918401611196565b60408601526060820135838111610185578161121e918401611196565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101855782611270918501611196565b9086015261014092838301359081116101855761128d9201611196565b90830152565b6bffffffffffffffffffffffff1990358181169392601481106112b557505050565b60140360031b82901b16169150565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206111b19381815201916112c4565b6040513d6000823e3d90fd5b90816020910312610185575190565b606080825282516001600160a01b031690820152919392916040916113d7906020810151608084015283810151611356610160918260a08701526101c0860190610260565b906113c4611376606085015193605f1994858983030160c08a0152610260565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610260565b92015190848303016101a0850152610260565b9460208201520152565b6000926001600160a01b039284927f0000000000000000000000000000000000000000000000000000000000000000851633036116d957610140948582019161143c611436611430858461108f565b906110c1565b9061116a565b9663ffffffff60e01b93600080516020611ee18339815191529285611462855460e01b90565b8b16166116c7578a9561147536836111b4565b9a168061152d5750926020979694926114aa6114a361149c6114be956114e39e9a9861108f565b80916110e0565b3691611029565b908701525460501c6001600160a01b031690565b935b8561151f575b604051633a871cdd60e01b81529889968795869360048501611311565b0393165af191821561062e576111b193926114ff575b50611e41565b61151891925060203d81116107fc576107ee81836101ee565b90386114f9565b8280808089335af1506114c6565b9798509296600160e01b81036115d65750916114e398979593916020979593611567611562611436611430606087018761108f565b610f78565b60018101549093906001600160a01b031697858916156115bf575b5061149c611593926114a39261108f565b9089015254607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617966114c0565b5460501c6001600160a01b0316975061149c611582565b919795939650919350600160e11b146000146116ba5761163b90611635611606611436611430606088018861108f565b9161162f610e0c61162961162361161d858b61108f565b906110cf565b90611293565b60601c90565b9561108f565b9161174b565b97939992989190999884871690813b156116b657918c91611676969594938360405180998195829463064acaab60e11b8452600484016112e5565b03925af1801561062e576114e39a6020998d9661169a936116a3575b503691611029565b908201526114c0565b806106226116b0926101a0565b38611692565b8c80fd5b5050505050505050600190565b60405163fc2f51c560e01b8152600490fd5b604051636b31ba1560e11b8152600490fd5b3590602081106116f9575090565b6000199060200360031b1b1690565b6040906111b19492815281602082015201916112c4565b6001600160d01b0319903581811693926006811061173c57505050565b60060360031b82901b16169150565b90929161175881856110fd565b611761916116eb565b9360588101938593607887019384886058019061177f918387611152565b611788916116eb565b611792828661110e565b61179b916116eb565b986117a6838761111f565b6117af91611293565b60601c906117be36828c611029565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198a1692820192909252606081019e909e526001600160a01b039490941660808e015260a0808e01919091528c529a8b929061183660c0826101ee565b519020611842906119a8565b600080516020611ee18339815191525490939060501c6001600160a01b03169101976078890161187391868a611152565b60405163199ed7c960e11b81529485939284928392611896929060048501611708565b03915afa92831561062e576115626118dc61021c956105369460009161198b575b506118d56118c5878b61110e565b6001600160a01b031992916116eb565b1690611e41565b9a61197b8561196b60788c8c01019b607719908303019a611942610e0c61162961162361192b61192561191f6119186116296116238c8b61111f565b9988611130565b9061171f565b60d01c90565b9c61193c61192561191f8389611141565b956110cf565b9461195c61194e61020f565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6119a291508d803d106107fc576107ee81836101ee565b386118b7565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611a35575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611a16565b600080516020611ee18339815191525460405163199ed7c960e11b81526001600160a01b03949093602093859360501c87169284928392611b0292919060048501611708565b03915afa801561062e57611b1e91600091611b8f575b50611bad565b60208101514265ffffffffffff90911611611b805742611b55611b4a604084015165ffffffffffff1690565b65ffffffffffff1690565b10611b8057516001600160a01b031616611b7457630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b0319919050565b611ba7915060203d81116107fc576107ee81836101ee565b38611b18565b604080516001600160401b03929060608101848111828210176101b35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611c22575b83519460608601908111868210176101b35784526001600160a01b038116855260d01c6020850152169082015290565b829150611bf2565b90816020910312610185575180151581036101855790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611ee183398151915254604051639ea9bd5960e01b8082526020926001600160a01b0392908490829060501c85168180611cbf363360048401611c42565b03915afa90811561062e57600091611dd7575b50611dcf57611cec6000356001600160e01b031916610f78565b6001810154611d03906001600160a01b0316610e0c565b92831615908115611d9a575b8115611d7b575b5015611d2457505050600090565b829060405192839182528180611d3e363360048401611c42565b03915afa91821561062e57600092611d5557505090565b6111b19250803d10611d74575b611d6c81836101ee565b810190611c2a565b503d611d62565b5460301c65ffffffffffff16905065ffffffffffff4291161138611d16565b905065ffffffffffff611db3825465ffffffffffff1690565b168015159081611dc5575b5090611d0f565b9050421138611dbe565b505050600190565b611dee9150843d8611611d7457611d6c81836101ee565b38611cd2565b600080516020611ee183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b906001600160a01b03808316919081168203611dcf578260d01c9065ffffffffffff809460a01c16938415611ed8575b808260d01c9260a01c16918215611ecf575b808410611ec7575b5080821690851611611ebf575b5060a09290921b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b925038611e98565b925038611e8b565b91508091611e83565b935083611e7156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x1a0633e9e78bdc97a7deeea1d13cb06c1f5ec735e67ec75a388e6f57daf9d20b", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x6e23d", + "value": "0x0", + "data": "0x60808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x3b" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xE7044516DC4584E1EC3307e252E3A689800227bB", + "initCode": "60808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xbcd2ed240dd78712e82c3e68f587f396f781e9ee6bdfea2196b847ed9ee1db90", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x55686", + "value": "0x0", + "data": "0x60c03461009f57601f61045038819003918201601f19168301916001600160401b038311848410176100a457808492604094855283398101031261009f5780516001600160a01b0391828216820361009f5760200151918216820361009f5760805260a05260405161039590816100bb823960805181818160610152818161011e015261025d015260a05181818160e1015281816101a601526102210152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040818152600436101561001457600080fd5b600091823560e01c9081630d253d76146101d5575080633a5381b5146101925780635fbfb9cf146100945763bc10273e1461004e57600080fd5b34610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b5034610090576100a33661029b565b91908151906bffffffffffffffffffffffff199060601b166020820152601481526100cd816102c6565b610109825193849263296601cd60e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b0392916020918591900381877f000000000000000000000000000000000000000000000000000000000000000087165af19283156101885760209493610159575b505191168152f35b61017a919350843d8111610181575b61017281836102f8565b81019061031a565b9138610151565b503d610168565b81513d86823e3d90fd5b5034610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b91905034610297576101e63661029b565b92906bffffffffffffffffffffffff199060601b1660208201526014815261020d816102c6565b6102498251938492631bb12e6960e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b03929160209185919003817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610188576020949361015957505191168152f35b8280fd5b60409060031901126102c1576004356001600160a01b03811681036102c1579060243590565b600080fd5b6040810190811067ffffffffffffffff8211176102e257604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102e257604052565b908160209103126102c157516001600160a01b03811681036102c15790565b9392919060018060a01b03168452602060608186015281519182606087015260005b8381106103815750505060808160008260409488010152601f8019910116850101930152565b81810183015187820160800152820161035b5600000000000000000000000088546cc16ec33fd449fa929fb8ac900793018784000000000000000000000000e7044516dc4584e1ec3307e252e3a689800227bb", + "nonce": "0x3c" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x4caf43D403Cf2e9cDE274E58343d3D0DCA1C571d", + "initCode": "60c03461009f57601f61045038819003918201601f19168301916001600160401b038311848410176100a457808492604094855283398101031261009f5780516001600160a01b0391828216820361009f5760200151918216820361009f5760805260a05260405161039590816100bb823960805181818160610152818161011e015261025d015260a05181818160e1015281816101a601526102210152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040818152600436101561001457600080fd5b600091823560e01c9081630d253d76146101d5575080633a5381b5146101925780635fbfb9cf146100945763bc10273e1461004e57600080fd5b34610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b5034610090576100a33661029b565b91908151906bffffffffffffffffffffffff199060601b166020820152601481526100cd816102c6565b610109825193849263296601cd60e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b0392916020918591900381877f000000000000000000000000000000000000000000000000000000000000000087165af19283156101885760209493610159575b505191168152f35b61017a919350843d8111610181575b61017281836102f8565b81019061031a565b9138610151565b503d610168565b81513d86823e3d90fd5b5034610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b91905034610297576101e63661029b565b92906bffffffffffffffffffffffff199060601b1660208201526014815261020d816102c6565b6102498251938492631bb12e6960e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b03929160209185919003817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610188576020949361015957505191168152f35b8280fd5b60409060031901126102c1576004356001600160a01b03811681036102c1579060243590565b600080fd5b6040810190811067ffffffffffffffff8211176102e257604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102e257604052565b908160209103126102c157516001600160a01b03811681036102c15790565b9392919060018060a01b03168452602060608186015281519182606087015260005b8381106103815750505060808160008260409488010152601f8019910116850101930152565b81810183015187820160800152820161035b5600000000000000000000000088546cc16ec33fd449fa929fb8ac900793018784000000000000000000000000e7044516dc4584e1ec3307e252e3a689800227bb" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xbb3a20da81d9d752f3e88c3acf252ba87b63cc472bc224b12c1f2075fb850851", + "0xf9988164183bf47b6ed3453c83f51fbb0f979c8d65fd927bb2c8a4558b4b9685", + "0x1a0633e9e78bdc97a7deeea1d13cb06c1f5ec735e67ec75a388e6f57daf9d20b", + "0xbcd2ed240dd78712e82c3e68f587f396f781e9ee6bdfea2196b847ed9ee1db90" + ], + "returns": {}, + "timestamp": 1690749002, + "chain": 80001, + "multi": false, + "commit": "199ae7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1690749009.json b/broadcast/DeployKernel.s.sol/80001/run-1690749009.json new file mode 100644 index 00000000..99f25b13 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1690749009.json @@ -0,0 +1,250 @@ +{ + "transactions": [ + { + "hash": "0xbb3a20da81d9d752f3e88c3acf252ba87b63cc472bc224b12c1f2075fb850851", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x7541a", + "value": "0x0", + "data": "0x6080806040523461001657610550908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c806319d9363c146102c55780634c96a3891461024e5780635414dff014610201578063ade809051461014f578063db4c545e146101215763e919e3ea1461006257600080fd5b8060031936011261011d5761007561038b565b602435928360601c80331490151715610112576100906103d4565b9360896013860187f59384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b84903d156100fb57503d81803e3d90fd5b63301164258252601cfd5b5063301164258552601cfd5b632f6348368552601cfd5b8280fd5b83823461014b578160031936011261014b57602090608960136101426103d4565b01209051908152f35b5080fd5b508060031936011261011d5761016361038b565b60243567ffffffffffffffff81116101fd5761018290369085016103a6565b61018d9491946103d4565b9060896013830188f09586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b8363301164258952601cfd5b8480fd5b5082903461014b57602036600319011261014b57602092608960136102246103d4565b012060ff84536035523060601b600152356015526055822091603552519060018060a01b03168152f35b50602036600319011261011d5761026361038b565b61026b6103d4565b9260896013850186f09384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b50606036600319011261011d576102da61038b565b6024359260443567ffffffffffffffff8111610387576102fd90369083016103a6565b8560609692961c8033149015171561037b576103176103d4565b9160896013840189f59586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b82632f6348368852601cfd5b8580fd5b600435906001600160a01b03821682036103a157565b600080fd5b9181601f840112156103a15782359167ffffffffffffffff83116103a157602083818601950101116103a157565b604051903060701c1561047857666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d825256fe09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", + "nonce": "0x39" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x61D48C31C95C7d5a7C567b38061a9fd52E1a3D97", + "initCode": "6080806040523461001657610550908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c806319d9363c146102c55780634c96a3891461024e5780635414dff014610201578063ade809051461014f578063db4c545e146101215763e919e3ea1461006257600080fd5b8060031936011261011d5761007561038b565b602435928360601c80331490151715610112576100906103d4565b9360896013860187f59384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b84903d156100fb57503d81803e3d90fd5b63301164258252601cfd5b5063301164258552601cfd5b632f6348368552601cfd5b8280fd5b83823461014b578160031936011261014b57602090608960136101426103d4565b01209051908152f35b5080fd5b508060031936011261011d5761016361038b565b60243567ffffffffffffffff81116101fd5761018290369085016103a6565b61018d9491946103d4565b9060896013830188f09586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b8363301164258952601cfd5b8480fd5b5082903461014b57602036600319011261014b57602092608960136102246103d4565b012060ff84536035523060601b600152356015526055822091603552519060018060a01b03168152f35b50602036600319011261011d5761026361038b565b61026b6103d4565b9260896013850186f09384156101065785848285839452600080516020610530833981519152602082015234885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b50606036600319011261011d576102da61038b565b6024359260443567ffffffffffffffff8111610387576102fd90369083016103a6565b8560609692961c8033149015171561037b576103176103d4565b9160896013840189f59586156101f1579181889392849387845260008051602061053083398151915260208501528884013786019034885af1156100ea57508260008051602061051083398151915285602096a3516001600160a01b039091168152f35b82632f6348368852601cfd5b8580fd5b600435906001600160a01b03821682036103a157565b600080fd5b9181601f840112156103a15782359167ffffffffffffffff83116103a157602083818601950101116103a157565b604051903060701c1561047857666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d825256fe09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xf9988164183bf47b6ed3453c83f51fbb0f979c8d65fd927bb2c8a4558b4b9685", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x2bc818", + "value": "0x0", + "data": "0x60e0346100f9576001600160401b0390601f61265638819003918201601f1916830191848311848410176100e35780849260409485528339810103126100f9578051906001600160a01b039081831683036100f95760200151908116918282036100f95760805260c052604051916120ed90818401908111848210176100e3576020928492610569843981520301906000f080156100d75760a05260405161046a90816100ff8239608051818181606c015281816101ee01526102df015260a0518181816101900152610356015260c0518160b30152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040818152600436101561001457600080fd5b600091823560e01c908163037637aa14610342575080631bb12e6914610276578063296601cd146100e2578063b0d691fe1461009f5763f961ea491461005957600080fd5b3461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b503461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6001600160601b0383836100f536610385565b849391945192602097889363347d5e2560e21b8587015260018060a01b039788821660248801528760448801528060648801526101796084948281878b01378b86848b01015261016d601f199761015e888c8b601f8901168101038d606482019052018c6103eb565b8b519485938b85019788610423565b038681018352826103eb565b519020169185519485936306764d8f60e21b8552887f0000000000000000000000000000000000000000000000000000000000000000166004860152602485015260606044850152805190816064860152858a5b83811061025f5750505090601f828a858795860101520116810103018187877f0000000000000000000000000000000000000000000000000000000000000000165af19384156102545793610225575b505191168152f35b610246919350843d861161024d575b61023e81836103eb565b81019061044b565b918461021d565b503d610234565b8251903d90823e3d90fd5b8281018201518982018701528896508791016101cd565b503461009b576001600160601b036102b76102a961029336610385565b8795939594919451948593602085019788610423565b03601f1981018352826103eb565b51902082516305414dff60e41b815291166004820152906001600160a01b03906020836024817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610338576020949361031957505191168152f35b610331919350843d811161024d5761023e81836103eb565b913861021d565b81513d86823e3d90fd5b83903461009b578160031936011261009b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60606003198201126103e6576004356001600160a01b03811681036103e6579160243567ffffffffffffffff928382116103e657806023830112156103e65781600401359384116103e657602484830101116103e657602401919060443590565b600080fd5b90601f8019910116810190811067ffffffffffffffff82111761040d57604052565b634e487b7160e01b600052604160045260246000fd5b90928092603495946001600160601b03199060601b1683526014830137019060148201520190565b908160209103126103e657516001600160a01b03811681036103e657905661014034620001b057601f620020ed38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611f019283620001ec8439608051836119cb015260a051836119ee015260c05183611a60015260e05183611a86015251826119aa0152518181816104b101528181610673015281816107880152818161091501528181610a4c01528181610c6f01528181610d9001528181610ea301528181610fcd01526113f10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b36610fb057005b60003560e01c806306fdde03146101755780630b3dc35414610170578063150b7a021461016b5780631626ba7e1461016657806329f8b174146101615780633659cfe61461015c5780633a871cdd146101575780633e1b08121461015257806351166ba01461014d578063519454471461014857806354fd4d501461014357806355b14f501461013e57806357b750471461013957806384b0196e1461013457806388e7fd061461012f57806394e2c9e31461012a578063b0d691fe14610125578063bc197c8114610120578063d087d2881461011b578063d1f5789414610116578063d5416221146101115763f23a6e610361000e57610f1e565b610e8c565b610ddc565b610d5d565b610cce565b610c59565b610c30565b610bfb565b610b53565b610b1c565b610a36565b6109de565b6108cc565b610803565b61073f565b6106f5565b61064f565b610443565b6103b1565b610357565b6102d4565b6102a0565b600091031261018557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101b357604052565b61018a565b608081019081106001600160401b038211176101b357604052565b604081019081106001600160401b038211176101b357604052565b90601f801991011681019081106001600160401b038211176101b357604052565b6040519061021c826101b8565b565b6040519061016082018281106001600160401b038211176101b357604052565b6040519061024b826101d3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061028c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161026b565b34610185576000366003190112610185576102d06102bc61023e565b604051918291602083526020830190610260565b0390f35b3461018557600036600319011261018557600080516020611ee18339815191525460405160509190911c6001600160a01b03168152602090f35b6001600160a01b0381160361018557565b359061021c8261030e565b9181601f84011215610185578235916001600160401b038311610185576020838186019501011161018557565b346101855760803660031901126101855761037360043561030e565b61037e60243561030e565b6064356001600160401b0381116101855761039d90369060040161032a565b5050604051630a85bd0160e11b8152602090f35b34610185576040366003190112610185576024356001600160401b038111610185576103ef6103e6602092369060040161032a565b90600435611abc565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361018557565b6064359065ffffffffffff8216820361018557565b6084359065ffffffffffff8216820361018557565b60c036600319011261018557610457610402565b602435906104648261030e565b604435906104718261030e565b610479610419565b9261048261042e565b9060a4356001600160401b038111610185576104a290369060040161032a565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610645575b61063357849261050f6105a6926105006104f261020f565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261053687610f78565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610185576040519063064acaab60e11b825281806105d06000998a94600484016112e5565b038183895af1801561062e57610615575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610622610628926101a0565b8061017a565b386105e1565b6112f6565b604051637046c88d60e01b8152600490fd5b50303314156104da565b6020366003190112610185576004356106678161030e565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106eb575b61063357807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561069c565b60031960603682011261018557600435906001600160401b038211610185576101609082360301126101855761073760209160443590602435906004016113e1565b604051908152f35b34610185576020366003190112610185576004356001600160c01b0381169081900361018557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d5575b506040519081529081906020820190565b6107f6915060203d81116107fc575b6107ee81836101ee565b810190611302565b386107c4565b503d6107e4565b34610185576020366003190112610185576102d0610848610822610402565b60006060604051610832816101b8565b8281528260208201528260408201520152610f78565b60405190610855826101b8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b6080366003190112610185576004356108e48161030e565b6044356001600160401b0381116101855761090390369060040161032a565b919060643592600284101561018557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806109a8575b61063357600191610957913691611029565b926109618161106f565b036109875760008281939260208394519201905af43d82803e15610983573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610983573d90f35b506109b86109b4611c7b565b1590565b610945565b604051906109ca826101d3565b6005825264302e322e3160d81b6020830152565b34610185576000366003190112610185576102d06102bc6109bd565b90604060031983011261018557600435610a138161030e565b91602435906001600160401b03821161018557610a329160040161032a565b9091565b610a3f366109fa565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610b12575b6106335780600080516020611ee18339815191525460501c1691610a9881611df4565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b03925af1801561062e57610afe575080f35b80610622610b0b926101a0565b80f35b8380fd5b5030331415610a75565b34610185576000366003190112610185576020600080516020611ee18339815191525460e01b6040519063ffffffff60e01b168152f35b3461018557600036600319011261018557610ba9610b6f61023e565b610b776109bd565b90604051928392600f60f81b8452610b9b60209360e08587015260e0860190610260565b908482036040860152610260565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610be457505050500390f35b835185528695509381019392810192600101610bd5565b34610185576000366003190112610185576020600080516020611ee18339815191525465ffffffffffff60405191831c168152f35b34610185576000366003190112610185576000546040516001600160a01b039091168152602090f35b34610185576000366003190112610185576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610185578235916001600160401b038311610185576020808501948460051b01011161018557565b346101855760a036600319011261018557610cea60043561030e565b610cf560243561030e565b6001600160401b0360443581811161018557610d15903690600401610c9e565b505060643581811161018557610d2f903690600401610c9e565b505060843590811161018557610d4990369060040161032a565b505060405163bc197c8160e01b8152602090f35b3461018557600036600319011261018557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d557506040519081529081906020820190565b610de5366109fa565b600080516020611ee18339815191525490926001600160a01b03918290610e189060501c82165b6001600160a01b031690565b16610e7b57610e2681611df4565b169160405191600093849281847fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8180a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b60405162dc149f60e41b8152600490fd5b602036600319011261018557610ea0610402565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610f14575b61063357600080516020611ee183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610ed3565b346101855760a036600319011261018557610f3a60043561030e565b610f4560243561030e565b6084356001600160401b03811161018557610f6490369060040161032a565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b6000610fc681356001600160e01b031916610f78565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061101a575b61063357818091368280378136915af43d82803e15610983573d90f35b50611023611c7b565b15610ffd565b9291926001600160401b0382116101b35760405191611052601f8201601f1916602001846101ee565b829481845281830111610185578281602093846000960137010152565b6002111561107957565b634e487b7160e01b600052602160045260246000fd5b903590601e198136030182121561018557018035906001600160401b0382116101855760200191813603831361018557565b906004116101855790600490565b906024116101855760100190601490565b909291928360041161018557831161018557600401916003190190565b906058116101855760380190602090565b906024116101855760040190602090565b906038116101855760240190601490565b90600a116101855760040190600690565b9060101161018557600a0190600690565b90939293848311610185578411610185578101920390565b6001600160e01b0319903581811693926004811061118757505050565b60040360031b82901b16169150565b9080601f83011215610185578160206111b193359101611029565b90565b919061016083820312610185576111c961021e565b926111d38161031f565b8452602081013560208501526040810135916001600160401b03928381116101855781611201918401611196565b60408601526060820135838111610185578161121e918401611196565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101855782611270918501611196565b9086015261014092838301359081116101855761128d9201611196565b90830152565b6bffffffffffffffffffffffff1990358181169392601481106112b557505050565b60140360031b82901b16169150565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206111b19381815201916112c4565b6040513d6000823e3d90fd5b90816020910312610185575190565b606080825282516001600160a01b031690820152919392916040916113d7906020810151608084015283810151611356610160918260a08701526101c0860190610260565b906113c4611376606085015193605f1994858983030160c08a0152610260565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610260565b92015190848303016101a0850152610260565b9460208201520152565b6000926001600160a01b039284927f0000000000000000000000000000000000000000000000000000000000000000851633036116d957610140948582019161143c611436611430858461108f565b906110c1565b9061116a565b9663ffffffff60e01b93600080516020611ee18339815191529285611462855460e01b90565b8b16166116c7578a9561147536836111b4565b9a168061152d5750926020979694926114aa6114a361149c6114be956114e39e9a9861108f565b80916110e0565b3691611029565b908701525460501c6001600160a01b031690565b935b8561151f575b604051633a871cdd60e01b81529889968795869360048501611311565b0393165af191821561062e576111b193926114ff575b50611e41565b61151891925060203d81116107fc576107ee81836101ee565b90386114f9565b8280808089335af1506114c6565b9798509296600160e01b81036115d65750916114e398979593916020979593611567611562611436611430606087018761108f565b610f78565b60018101549093906001600160a01b031697858916156115bf575b5061149c611593926114a39261108f565b9089015254607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617966114c0565b5460501c6001600160a01b0316975061149c611582565b919795939650919350600160e11b146000146116ba5761163b90611635611606611436611430606088018861108f565b9161162f610e0c61162961162361161d858b61108f565b906110cf565b90611293565b60601c90565b9561108f565b9161174b565b97939992989190999884871690813b156116b657918c91611676969594938360405180998195829463064acaab60e11b8452600484016112e5565b03925af1801561062e576114e39a6020998d9661169a936116a3575b503691611029565b908201526114c0565b806106226116b0926101a0565b38611692565b8c80fd5b5050505050505050600190565b60405163fc2f51c560e01b8152600490fd5b604051636b31ba1560e11b8152600490fd5b3590602081106116f9575090565b6000199060200360031b1b1690565b6040906111b19492815281602082015201916112c4565b6001600160d01b0319903581811693926006811061173c57505050565b60060360031b82901b16169150565b90929161175881856110fd565b611761916116eb565b9360588101938593607887019384886058019061177f918387611152565b611788916116eb565b611792828661110e565b61179b916116eb565b986117a6838761111f565b6117af91611293565b60601c906117be36828c611029565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198a1692820192909252606081019e909e526001600160a01b039490941660808e015260a0808e01919091528c529a8b929061183660c0826101ee565b519020611842906119a8565b600080516020611ee18339815191525490939060501c6001600160a01b03169101976078890161187391868a611152565b60405163199ed7c960e11b81529485939284928392611896929060048501611708565b03915afa92831561062e576115626118dc61021c956105369460009161198b575b506118d56118c5878b61110e565b6001600160a01b031992916116eb565b1690611e41565b9a61197b8561196b60788c8c01019b607719908303019a611942610e0c61162961162361192b61192561191f6119186116296116238c8b61111f565b9988611130565b9061171f565b60d01c90565b9c61193c61192561191f8389611141565b956110cf565b9461195c61194e61020f565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6119a291508d803d106107fc576107ee81836101ee565b386118b7565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611a35575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611a16565b600080516020611ee18339815191525460405163199ed7c960e11b81526001600160a01b03949093602093859360501c87169284928392611b0292919060048501611708565b03915afa801561062e57611b1e91600091611b8f575b50611bad565b60208101514265ffffffffffff90911611611b805742611b55611b4a604084015165ffffffffffff1690565b65ffffffffffff1690565b10611b8057516001600160a01b031616611b7457630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b0319919050565b611ba7915060203d81116107fc576107ee81836101ee565b38611b18565b604080516001600160401b03929060608101848111828210176101b35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611c22575b83519460608601908111868210176101b35784526001600160a01b038116855260d01c6020850152169082015290565b829150611bf2565b90816020910312610185575180151581036101855790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611ee183398151915254604051639ea9bd5960e01b8082526020926001600160a01b0392908490829060501c85168180611cbf363360048401611c42565b03915afa90811561062e57600091611dd7575b50611dcf57611cec6000356001600160e01b031916610f78565b6001810154611d03906001600160a01b0316610e0c565b92831615908115611d9a575b8115611d7b575b5015611d2457505050600090565b829060405192839182528180611d3e363360048401611c42565b03915afa91821561062e57600092611d5557505090565b6111b19250803d10611d74575b611d6c81836101ee565b810190611c2a565b503d611d62565b5460301c65ffffffffffff16905065ffffffffffff4291161138611d16565b905065ffffffffffff611db3825465ffffffffffff1690565b168015159081611dc5575b5090611d0f565b9050421138611dbe565b505050600190565b611dee9150843d8611611d7457611d6c81836101ee565b38611cd2565b600080516020611ee183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b906001600160a01b03808316919081168203611dcf578260d01c9065ffffffffffff809460a01c16938415611ed8575b808260d01c9260a01c16918215611ecf575b808410611ec7575b5080821690851611611ebf575b5060a09290921b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b925038611e98565b925038611e8b565b91508091611e83565b935083611e7156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd900000000000000000000000061d48c31c95c7d5a7c567b38061a9fd52e1a3d970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x88546cc16eC33FD449fa929Fb8ac900793018784", + "initCode": "60e0346100f9576001600160401b0390601f61265638819003918201601f1916830191848311848410176100e35780849260409485528339810103126100f9578051906001600160a01b039081831683036100f95760200151908116918282036100f95760805260c052604051916120ed90818401908111848210176100e3576020928492610569843981520301906000f080156100d75760a05260405161046a90816100ff8239608051818181606c015281816101ee01526102df015260a0518181816101900152610356015260c0518160b30152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040818152600436101561001457600080fd5b600091823560e01c908163037637aa14610342575080631bb12e6914610276578063296601cd146100e2578063b0d691fe1461009f5763f961ea491461005957600080fd5b3461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b503461009b578160031936011261009b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6001600160601b0383836100f536610385565b849391945192602097889363347d5e2560e21b8587015260018060a01b039788821660248801528760448801528060648801526101796084948281878b01378b86848b01015261016d601f199761015e888c8b601f8901168101038d606482019052018c6103eb565b8b519485938b85019788610423565b038681018352826103eb565b519020169185519485936306764d8f60e21b8552887f0000000000000000000000000000000000000000000000000000000000000000166004860152602485015260606044850152805190816064860152858a5b83811061025f5750505090601f828a858795860101520116810103018187877f0000000000000000000000000000000000000000000000000000000000000000165af19384156102545793610225575b505191168152f35b610246919350843d861161024d575b61023e81836103eb565b81019061044b565b918461021d565b503d610234565b8251903d90823e3d90fd5b8281018201518982018701528896508791016101cd565b503461009b576001600160601b036102b76102a961029336610385565b8795939594919451948593602085019788610423565b03601f1981018352826103eb565b51902082516305414dff60e41b815291166004820152906001600160a01b03906020836024817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610338576020949361031957505191168152f35b610331919350843d811161024d5761023e81836103eb565b913861021d565b81513d86823e3d90fd5b83903461009b578160031936011261009b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60606003198201126103e6576004356001600160a01b03811681036103e6579160243567ffffffffffffffff928382116103e657806023830112156103e65781600401359384116103e657602484830101116103e657602401919060443590565b600080fd5b90601f8019910116810190811067ffffffffffffffff82111761040d57604052565b634e487b7160e01b600052604160045260246000fd5b90928092603495946001600160601b03199060601b1683526014830137019060148201520190565b908160209103126103e657516001600160a01b03811681036103e657905661014034620001b057601f620020ed38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611f019283620001ec8439608051836119cb015260a051836119ee015260c05183611a60015260e05183611a86015251826119aa0152518181816104b101528181610673015281816107880152818161091501528181610a4c01528181610c6f01528181610d9001528181610ea301528181610fcd01526113f10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b36610fb057005b60003560e01c806306fdde03146101755780630b3dc35414610170578063150b7a021461016b5780631626ba7e1461016657806329f8b174146101615780633659cfe61461015c5780633a871cdd146101575780633e1b08121461015257806351166ba01461014d578063519454471461014857806354fd4d501461014357806355b14f501461013e57806357b750471461013957806384b0196e1461013457806388e7fd061461012f57806394e2c9e31461012a578063b0d691fe14610125578063bc197c8114610120578063d087d2881461011b578063d1f5789414610116578063d5416221146101115763f23a6e610361000e57610f1e565b610e8c565b610ddc565b610d5d565b610cce565b610c59565b610c30565b610bfb565b610b53565b610b1c565b610a36565b6109de565b6108cc565b610803565b61073f565b6106f5565b61064f565b610443565b6103b1565b610357565b6102d4565b6102a0565b600091031261018557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101b357604052565b61018a565b608081019081106001600160401b038211176101b357604052565b604081019081106001600160401b038211176101b357604052565b90601f801991011681019081106001600160401b038211176101b357604052565b6040519061021c826101b8565b565b6040519061016082018281106001600160401b038211176101b357604052565b6040519061024b826101d3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061028c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161026b565b34610185576000366003190112610185576102d06102bc61023e565b604051918291602083526020830190610260565b0390f35b3461018557600036600319011261018557600080516020611ee18339815191525460405160509190911c6001600160a01b03168152602090f35b6001600160a01b0381160361018557565b359061021c8261030e565b9181601f84011215610185578235916001600160401b038311610185576020838186019501011161018557565b346101855760803660031901126101855761037360043561030e565b61037e60243561030e565b6064356001600160401b0381116101855761039d90369060040161032a565b5050604051630a85bd0160e11b8152602090f35b34610185576040366003190112610185576024356001600160401b038111610185576103ef6103e6602092369060040161032a565b90600435611abc565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361018557565b6064359065ffffffffffff8216820361018557565b6084359065ffffffffffff8216820361018557565b60c036600319011261018557610457610402565b602435906104648261030e565b604435906104718261030e565b610479610419565b9261048261042e565b9060a4356001600160401b038111610185576104a290369060040161032a565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610645575b61063357849261050f6105a6926105006104f261020f565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261053687610f78565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610185576040519063064acaab60e11b825281806105d06000998a94600484016112e5565b038183895af1801561062e57610615575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610622610628926101a0565b8061017a565b386105e1565b6112f6565b604051637046c88d60e01b8152600490fd5b50303314156104da565b6020366003190112610185576004356106678161030e565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106eb575b61063357807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561069c565b60031960603682011261018557600435906001600160401b038211610185576101609082360301126101855761073760209160443590602435906004016113e1565b604051908152f35b34610185576020366003190112610185576004356001600160c01b0381169081900361018557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d5575b506040519081529081906020820190565b6107f6915060203d81116107fc575b6107ee81836101ee565b810190611302565b386107c4565b503d6107e4565b34610185576020366003190112610185576102d0610848610822610402565b60006060604051610832816101b8565b8281528260208201528260408201520152610f78565b60405190610855826101b8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b6080366003190112610185576004356108e48161030e565b6044356001600160401b0381116101855761090390369060040161032a565b919060643592600284101561018557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806109a8575b61063357600191610957913691611029565b926109618161106f565b036109875760008281939260208394519201905af43d82803e15610983573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610983573d90f35b506109b86109b4611c7b565b1590565b610945565b604051906109ca826101d3565b6005825264302e322e3160d81b6020830152565b34610185576000366003190112610185576102d06102bc6109bd565b90604060031983011261018557600435610a138161030e565b91602435906001600160401b03821161018557610a329160040161032a565b9091565b610a3f366109fa565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610b12575b6106335780600080516020611ee18339815191525460501c1691610a9881611df4565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b03925af1801561062e57610afe575080f35b80610622610b0b926101a0565b80f35b8380fd5b5030331415610a75565b34610185576000366003190112610185576020600080516020611ee18339815191525460e01b6040519063ffffffff60e01b168152f35b3461018557600036600319011261018557610ba9610b6f61023e565b610b776109bd565b90604051928392600f60f81b8452610b9b60209360e08587015260e0860190610260565b908482036040860152610260565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610be457505050500390f35b835185528695509381019392810192600101610bd5565b34610185576000366003190112610185576020600080516020611ee18339815191525465ffffffffffff60405191831c168152f35b34610185576000366003190112610185576000546040516001600160a01b039091168152602090f35b34610185576000366003190112610185576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610185578235916001600160401b038311610185576020808501948460051b01011161018557565b346101855760a036600319011261018557610cea60043561030e565b610cf560243561030e565b6001600160401b0360443581811161018557610d15903690600401610c9e565b505060643581811161018557610d2f903690600401610c9e565b505060843590811161018557610d4990369060040161032a565b505060405163bc197c8160e01b8152602090f35b3461018557600036600319011261018557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d557506040519081529081906020820190565b610de5366109fa565b600080516020611ee18339815191525490926001600160a01b03918290610e189060501c82165b6001600160a01b031690565b16610e7b57610e2681611df4565b169160405191600093849281847fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8180a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b60405162dc149f60e41b8152600490fd5b602036600319011261018557610ea0610402565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610f14575b61063357600080516020611ee183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610ed3565b346101855760a036600319011261018557610f3a60043561030e565b610f4560243561030e565b6084356001600160401b03811161018557610f6490369060040161032a565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b6000610fc681356001600160e01b031916610f78565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061101a575b61063357818091368280378136915af43d82803e15610983573d90f35b50611023611c7b565b15610ffd565b9291926001600160401b0382116101b35760405191611052601f8201601f1916602001846101ee565b829481845281830111610185578281602093846000960137010152565b6002111561107957565b634e487b7160e01b600052602160045260246000fd5b903590601e198136030182121561018557018035906001600160401b0382116101855760200191813603831361018557565b906004116101855790600490565b906024116101855760100190601490565b909291928360041161018557831161018557600401916003190190565b906058116101855760380190602090565b906024116101855760040190602090565b906038116101855760240190601490565b90600a116101855760040190600690565b9060101161018557600a0190600690565b90939293848311610185578411610185578101920390565b6001600160e01b0319903581811693926004811061118757505050565b60040360031b82901b16169150565b9080601f83011215610185578160206111b193359101611029565b90565b919061016083820312610185576111c961021e565b926111d38161031f565b8452602081013560208501526040810135916001600160401b03928381116101855781611201918401611196565b60408601526060820135838111610185578161121e918401611196565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101855782611270918501611196565b9086015261014092838301359081116101855761128d9201611196565b90830152565b6bffffffffffffffffffffffff1990358181169392601481106112b557505050565b60140360031b82901b16169150565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206111b19381815201916112c4565b6040513d6000823e3d90fd5b90816020910312610185575190565b606080825282516001600160a01b031690820152919392916040916113d7906020810151608084015283810151611356610160918260a08701526101c0860190610260565b906113c4611376606085015193605f1994858983030160c08a0152610260565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610260565b92015190848303016101a0850152610260565b9460208201520152565b6000926001600160a01b039284927f0000000000000000000000000000000000000000000000000000000000000000851633036116d957610140948582019161143c611436611430858461108f565b906110c1565b9061116a565b9663ffffffff60e01b93600080516020611ee18339815191529285611462855460e01b90565b8b16166116c7578a9561147536836111b4565b9a168061152d5750926020979694926114aa6114a361149c6114be956114e39e9a9861108f565b80916110e0565b3691611029565b908701525460501c6001600160a01b031690565b935b8561151f575b604051633a871cdd60e01b81529889968795869360048501611311565b0393165af191821561062e576111b193926114ff575b50611e41565b61151891925060203d81116107fc576107ee81836101ee565b90386114f9565b8280808089335af1506114c6565b9798509296600160e01b81036115d65750916114e398979593916020979593611567611562611436611430606087018761108f565b610f78565b60018101549093906001600160a01b031697858916156115bf575b5061149c611593926114a39261108f565b9089015254607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617966114c0565b5460501c6001600160a01b0316975061149c611582565b919795939650919350600160e11b146000146116ba5761163b90611635611606611436611430606088018861108f565b9161162f610e0c61162961162361161d858b61108f565b906110cf565b90611293565b60601c90565b9561108f565b9161174b565b97939992989190999884871690813b156116b657918c91611676969594938360405180998195829463064acaab60e11b8452600484016112e5565b03925af1801561062e576114e39a6020998d9661169a936116a3575b503691611029565b908201526114c0565b806106226116b0926101a0565b38611692565b8c80fd5b5050505050505050600190565b60405163fc2f51c560e01b8152600490fd5b604051636b31ba1560e11b8152600490fd5b3590602081106116f9575090565b6000199060200360031b1b1690565b6040906111b19492815281602082015201916112c4565b6001600160d01b0319903581811693926006811061173c57505050565b60060360031b82901b16169150565b90929161175881856110fd565b611761916116eb565b9360588101938593607887019384886058019061177f918387611152565b611788916116eb565b611792828661110e565b61179b916116eb565b986117a6838761111f565b6117af91611293565b60601c906117be36828c611029565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198a1692820192909252606081019e909e526001600160a01b039490941660808e015260a0808e01919091528c529a8b929061183660c0826101ee565b519020611842906119a8565b600080516020611ee18339815191525490939060501c6001600160a01b03169101976078890161187391868a611152565b60405163199ed7c960e11b81529485939284928392611896929060048501611708565b03915afa92831561062e576115626118dc61021c956105369460009161198b575b506118d56118c5878b61110e565b6001600160a01b031992916116eb565b1690611e41565b9a61197b8561196b60788c8c01019b607719908303019a611942610e0c61162961162361192b61192561191f6119186116296116238c8b61111f565b9988611130565b9061171f565b60d01c90565b9c61193c61192561191f8389611141565b956110cf565b9461195c61194e61020f565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6119a291508d803d106107fc576107ee81836101ee565b386118b7565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611a35575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611a16565b600080516020611ee18339815191525460405163199ed7c960e11b81526001600160a01b03949093602093859360501c87169284928392611b0292919060048501611708565b03915afa801561062e57611b1e91600091611b8f575b50611bad565b60208101514265ffffffffffff90911611611b805742611b55611b4a604084015165ffffffffffff1690565b65ffffffffffff1690565b10611b8057516001600160a01b031616611b7457630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b0319919050565b611ba7915060203d81116107fc576107ee81836101ee565b38611b18565b604080516001600160401b03929060608101848111828210176101b35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611c22575b83519460608601908111868210176101b35784526001600160a01b038116855260d01c6020850152169082015290565b829150611bf2565b90816020910312610185575180151581036101855790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611ee183398151915254604051639ea9bd5960e01b8082526020926001600160a01b0392908490829060501c85168180611cbf363360048401611c42565b03915afa90811561062e57600091611dd7575b50611dcf57611cec6000356001600160e01b031916610f78565b6001810154611d03906001600160a01b0316610e0c565b92831615908115611d9a575b8115611d7b575b5015611d2457505050600090565b829060405192839182528180611d3e363360048401611c42565b03915afa91821561062e57600092611d5557505090565b6111b19250803d10611d74575b611d6c81836101ee565b810190611c2a565b503d611d62565b5460301c65ffffffffffff16905065ffffffffffff4291161138611d16565b905065ffffffffffff611db3825465ffffffffffff1690565b168015159081611dc5575b5090611d0f565b9050421138611dbe565b505050600190565b611dee9150843d8611611d7457611d6c81836101ee565b38611cd2565b600080516020611ee183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b906001600160a01b03808316919081168203611dcf578260d01c9065ffffffffffff809460a01c16938415611ed8575b808260d01c9260a01c16918215611ecf575b808410611ec7575b5080821690851611611ebf575b5060a09290921b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b925038611e98565b925038611e8b565b91508091611e83565b935083611e7156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd900000000000000000000000061d48c31c95c7d5a7c567b38061a9fd52e1a3d970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + }, + { + "transactionType": "CREATE", + "address": "0xdf89afDD53c813B645928a66594F2b841Da38BEA", + "initCode": "61014034620001b057601f620020ed38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611f019283620001ec8439608051836119cb015260a051836119ee015260c05183611a60015260e05183611a86015251826119aa0152518181816104b101528181610673015281816107880152818161091501528181610a4c01528181610c6f01528181610d9001528181610ea301528181610fcd01526113f10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b36610fb057005b60003560e01c806306fdde03146101755780630b3dc35414610170578063150b7a021461016b5780631626ba7e1461016657806329f8b174146101615780633659cfe61461015c5780633a871cdd146101575780633e1b08121461015257806351166ba01461014d578063519454471461014857806354fd4d501461014357806355b14f501461013e57806357b750471461013957806384b0196e1461013457806388e7fd061461012f57806394e2c9e31461012a578063b0d691fe14610125578063bc197c8114610120578063d087d2881461011b578063d1f5789414610116578063d5416221146101115763f23a6e610361000e57610f1e565b610e8c565b610ddc565b610d5d565b610cce565b610c59565b610c30565b610bfb565b610b53565b610b1c565b610a36565b6109de565b6108cc565b610803565b61073f565b6106f5565b61064f565b610443565b6103b1565b610357565b6102d4565b6102a0565b600091031261018557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101b357604052565b61018a565b608081019081106001600160401b038211176101b357604052565b604081019081106001600160401b038211176101b357604052565b90601f801991011681019081106001600160401b038211176101b357604052565b6040519061021c826101b8565b565b6040519061016082018281106001600160401b038211176101b357604052565b6040519061024b826101d3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061028c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161026b565b34610185576000366003190112610185576102d06102bc61023e565b604051918291602083526020830190610260565b0390f35b3461018557600036600319011261018557600080516020611ee18339815191525460405160509190911c6001600160a01b03168152602090f35b6001600160a01b0381160361018557565b359061021c8261030e565b9181601f84011215610185578235916001600160401b038311610185576020838186019501011161018557565b346101855760803660031901126101855761037360043561030e565b61037e60243561030e565b6064356001600160401b0381116101855761039d90369060040161032a565b5050604051630a85bd0160e11b8152602090f35b34610185576040366003190112610185576024356001600160401b038111610185576103ef6103e6602092369060040161032a565b90600435611abc565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361018557565b6064359065ffffffffffff8216820361018557565b6084359065ffffffffffff8216820361018557565b60c036600319011261018557610457610402565b602435906104648261030e565b604435906104718261030e565b610479610419565b9261048261042e565b9060a4356001600160401b038111610185576104a290369060040161032a565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610645575b61063357849261050f6105a6926105006104f261020f565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261053687610f78565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610185576040519063064acaab60e11b825281806105d06000998a94600484016112e5565b038183895af1801561062e57610615575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610622610628926101a0565b8061017a565b386105e1565b6112f6565b604051637046c88d60e01b8152600490fd5b50303314156104da565b6020366003190112610185576004356106678161030e565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106eb575b61063357807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561069c565b60031960603682011261018557600435906001600160401b038211610185576101609082360301126101855761073760209160443590602435906004016113e1565b604051908152f35b34610185576020366003190112610185576004356001600160c01b0381169081900361018557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d5575b506040519081529081906020820190565b6107f6915060203d81116107fc575b6107ee81836101ee565b810190611302565b386107c4565b503d6107e4565b34610185576020366003190112610185576102d0610848610822610402565b60006060604051610832816101b8565b8281528260208201528260408201520152610f78565b60405190610855826101b8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b6080366003190112610185576004356108e48161030e565b6044356001600160401b0381116101855761090390369060040161032a565b919060643592600284101561018557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806109a8575b61063357600191610957913691611029565b926109618161106f565b036109875760008281939260208394519201905af43d82803e15610983573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610983573d90f35b506109b86109b4611c7b565b1590565b610945565b604051906109ca826101d3565b6005825264302e322e3160d81b6020830152565b34610185576000366003190112610185576102d06102bc6109bd565b90604060031983011261018557600435610a138161030e565b91602435906001600160401b03821161018557610a329160040161032a565b9091565b610a3f366109fa565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610b12575b6106335780600080516020611ee18339815191525460501c1691610a9881611df4565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b03925af1801561062e57610afe575080f35b80610622610b0b926101a0565b80f35b8380fd5b5030331415610a75565b34610185576000366003190112610185576020600080516020611ee18339815191525460e01b6040519063ffffffff60e01b168152f35b3461018557600036600319011261018557610ba9610b6f61023e565b610b776109bd565b90604051928392600f60f81b8452610b9b60209360e08587015260e0860190610260565b908482036040860152610260565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610be457505050500390f35b835185528695509381019392810192600101610bd5565b34610185576000366003190112610185576020600080516020611ee18339815191525465ffffffffffff60405191831c168152f35b34610185576000366003190112610185576000546040516001600160a01b039091168152602090f35b34610185576000366003190112610185576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610185578235916001600160401b038311610185576020808501948460051b01011161018557565b346101855760a036600319011261018557610cea60043561030e565b610cf560243561030e565b6001600160401b0360443581811161018557610d15903690600401610c9e565b505060643581811161018557610d2f903690600401610c9e565b505060843590811161018557610d4990369060040161032a565b505060405163bc197c8160e01b8152602090f35b3461018557600036600319011261018557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561062e576102d0916000916107d557506040519081529081906020820190565b610de5366109fa565b600080516020611ee18339815191525490926001600160a01b03918290610e189060501c82165b6001600160a01b031690565b16610e7b57610e2681611df4565b169160405191600093849281847fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8180a3813b15610b0e578385610aec819593829463064acaab60e11b8452600484016112e5565b60405162dc149f60e41b8152600490fd5b602036600319011261018557610ea0610402565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610f14575b61063357600080516020611ee183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610ed3565b346101855760a036600319011261018557610f3a60043561030e565b610f4560243561030e565b6084356001600160401b03811161018557610f6490369060040161032a565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b6000610fc681356001600160e01b031916610f78565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061101a575b61063357818091368280378136915af43d82803e15610983573d90f35b50611023611c7b565b15610ffd565b9291926001600160401b0382116101b35760405191611052601f8201601f1916602001846101ee565b829481845281830111610185578281602093846000960137010152565b6002111561107957565b634e487b7160e01b600052602160045260246000fd5b903590601e198136030182121561018557018035906001600160401b0382116101855760200191813603831361018557565b906004116101855790600490565b906024116101855760100190601490565b909291928360041161018557831161018557600401916003190190565b906058116101855760380190602090565b906024116101855760040190602090565b906038116101855760240190601490565b90600a116101855760040190600690565b9060101161018557600a0190600690565b90939293848311610185578411610185578101920390565b6001600160e01b0319903581811693926004811061118757505050565b60040360031b82901b16169150565b9080601f83011215610185578160206111b193359101611029565b90565b919061016083820312610185576111c961021e565b926111d38161031f565b8452602081013560208501526040810135916001600160401b03928381116101855781611201918401611196565b60408601526060820135838111610185578161121e918401611196565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101855782611270918501611196565b9086015261014092838301359081116101855761128d9201611196565b90830152565b6bffffffffffffffffffffffff1990358181169392601481106112b557505050565b60140360031b82901b16169150565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206111b19381815201916112c4565b6040513d6000823e3d90fd5b90816020910312610185575190565b606080825282516001600160a01b031690820152919392916040916113d7906020810151608084015283810151611356610160918260a08701526101c0860190610260565b906113c4611376606085015193605f1994858983030160c08a0152610260565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610260565b92015190848303016101a0850152610260565b9460208201520152565b6000926001600160a01b039284927f0000000000000000000000000000000000000000000000000000000000000000851633036116d957610140948582019161143c611436611430858461108f565b906110c1565b9061116a565b9663ffffffff60e01b93600080516020611ee18339815191529285611462855460e01b90565b8b16166116c7578a9561147536836111b4565b9a168061152d5750926020979694926114aa6114a361149c6114be956114e39e9a9861108f565b80916110e0565b3691611029565b908701525460501c6001600160a01b031690565b935b8561151f575b604051633a871cdd60e01b81529889968795869360048501611311565b0393165af191821561062e576111b193926114ff575b50611e41565b61151891925060203d81116107fc576107ee81836101ee565b90386114f9565b8280808089335af1506114c6565b9798509296600160e01b81036115d65750916114e398979593916020979593611567611562611436611430606087018761108f565b610f78565b60018101549093906001600160a01b031697858916156115bf575b5061149c611593926114a39261108f565b9089015254607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617966114c0565b5460501c6001600160a01b0316975061149c611582565b919795939650919350600160e11b146000146116ba5761163b90611635611606611436611430606088018861108f565b9161162f610e0c61162961162361161d858b61108f565b906110cf565b90611293565b60601c90565b9561108f565b9161174b565b97939992989190999884871690813b156116b657918c91611676969594938360405180998195829463064acaab60e11b8452600484016112e5565b03925af1801561062e576114e39a6020998d9661169a936116a3575b503691611029565b908201526114c0565b806106226116b0926101a0565b38611692565b8c80fd5b5050505050505050600190565b60405163fc2f51c560e01b8152600490fd5b604051636b31ba1560e11b8152600490fd5b3590602081106116f9575090565b6000199060200360031b1b1690565b6040906111b19492815281602082015201916112c4565b6001600160d01b0319903581811693926006811061173c57505050565b60060360031b82901b16169150565b90929161175881856110fd565b611761916116eb565b9360588101938593607887019384886058019061177f918387611152565b611788916116eb565b611792828661110e565b61179b916116eb565b986117a6838761111f565b6117af91611293565b60601c906117be36828c611029565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198a1692820192909252606081019e909e526001600160a01b039490941660808e015260a0808e01919091528c529a8b929061183660c0826101ee565b519020611842906119a8565b600080516020611ee18339815191525490939060501c6001600160a01b03169101976078890161187391868a611152565b60405163199ed7c960e11b81529485939284928392611896929060048501611708565b03915afa92831561062e576115626118dc61021c956105369460009161198b575b506118d56118c5878b61110e565b6001600160a01b031992916116eb565b1690611e41565b9a61197b8561196b60788c8c01019b607719908303019a611942610e0c61162961162361192b61192561191f6119186116296116238c8b61111f565b9988611130565b9061171f565b60d01c90565b9c61193c61192561191f8389611141565b956110cf565b9461195c61194e61020f565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6119a291508d803d106107fc576107ee81836101ee565b386118b7565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611a35575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611a16565b600080516020611ee18339815191525460405163199ed7c960e11b81526001600160a01b03949093602093859360501c87169284928392611b0292919060048501611708565b03915afa801561062e57611b1e91600091611b8f575b50611bad565b60208101514265ffffffffffff90911611611b805742611b55611b4a604084015165ffffffffffff1690565b65ffffffffffff1690565b10611b8057516001600160a01b031616611b7457630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b0319919050565b611ba7915060203d81116107fc576107ee81836101ee565b38611b18565b604080516001600160401b03929060608101848111828210176101b35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611c22575b83519460608601908111868210176101b35784526001600160a01b038116855260d01c6020850152169082015290565b829150611bf2565b90816020910312610185575180151581036101855790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611ee183398151915254604051639ea9bd5960e01b8082526020926001600160a01b0392908490829060501c85168180611cbf363360048401611c42565b03915afa90811561062e57600091611dd7575b50611dcf57611cec6000356001600160e01b031916610f78565b6001810154611d03906001600160a01b0316610e0c565b92831615908115611d9a575b8115611d7b575b5015611d2457505050600090565b829060405192839182528180611d3e363360048401611c42565b03915afa91821561062e57600092611d5557505090565b6111b19250803d10611d74575b611d6c81836101ee565b810190611c2a565b503d611d62565b5460301c65ffffffffffff16905065ffffffffffff4291161138611d16565b905065ffffffffffff611db3825465ffffffffffff1690565b168015159081611dc5575b5090611d0f565b9050421138611dbe565b505050600190565b611dee9150843d8611611d7457611d6c81836101ee565b38611cd2565b600080516020611ee183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b906001600160a01b03808316919081168203611dcf578260d01c9065ffffffffffff809460a01c16938415611ed8575b808260d01c9260a01c16918215611ecf575b808410611ec7575b5080821690851611611ebf575b5060a09290921b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b925038611e98565b925038611e8b565b91508091611e83565b935083611e7156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x1a0633e9e78bdc97a7deeea1d13cb06c1f5ec735e67ec75a388e6f57daf9d20b", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x6e23d", + "value": "0x0", + "data": "0x60808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x3b" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xE7044516DC4584E1EC3307e252E3A689800227bB", + "initCode": "60808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xbcd2ed240dd78712e82c3e68f587f396f781e9ee6bdfea2196b847ed9ee1db90", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", + "gas": "0x55686", + "value": "0x0", + "data": "0x60c03461009f57601f61045038819003918201601f19168301916001600160401b038311848410176100a457808492604094855283398101031261009f5780516001600160a01b0391828216820361009f5760200151918216820361009f5760805260a05260405161039590816100bb823960805181818160610152818161011e015261025d015260a05181818160e1015281816101a601526102210152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040818152600436101561001457600080fd5b600091823560e01c9081630d253d76146101d5575080633a5381b5146101925780635fbfb9cf146100945763bc10273e1461004e57600080fd5b34610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b5034610090576100a33661029b565b91908151906bffffffffffffffffffffffff199060601b166020820152601481526100cd816102c6565b610109825193849263296601cd60e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b0392916020918591900381877f000000000000000000000000000000000000000000000000000000000000000087165af19283156101885760209493610159575b505191168152f35b61017a919350843d8111610181575b61017281836102f8565b81019061031a565b9138610151565b503d610168565b81513d86823e3d90fd5b5034610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b91905034610297576101e63661029b565b92906bffffffffffffffffffffffff199060601b1660208201526014815261020d816102c6565b6102498251938492631bb12e6960e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b03929160209185919003817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610188576020949361015957505191168152f35b8280fd5b60409060031901126102c1576004356001600160a01b03811681036102c1579060243590565b600080fd5b6040810190811067ffffffffffffffff8211176102e257604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102e257604052565b908160209103126102c157516001600160a01b03811681036102c15790565b9392919060018060a01b03168452602060608186015281519182606087015260005b8381106103815750505060808160008260409488010152601f8019910116850101930152565b81810183015187820160800152820161035b5600000000000000000000000088546cc16ec33fd449fa929fb8ac900793018784000000000000000000000000e7044516dc4584e1ec3307e252e3a689800227bb", + "nonce": "0x3c" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x4caf43D403Cf2e9cDE274E58343d3D0DCA1C571d", + "initCode": "60c03461009f57601f61045038819003918201601f19168301916001600160401b038311848410176100a457808492604094855283398101031261009f5780516001600160a01b0391828216820361009f5760200151918216820361009f5760805260a05260405161039590816100bb823960805181818160610152818161011e015261025d015260a05181818160e1015281816101a601526102210152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040818152600436101561001457600080fd5b600091823560e01c9081630d253d76146101d5575080633a5381b5146101925780635fbfb9cf146100945763bc10273e1461004e57600080fd5b34610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b5034610090576100a33661029b565b91908151906bffffffffffffffffffffffff199060601b166020820152601481526100cd816102c6565b610109825193849263296601cd60e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b0392916020918591900381877f000000000000000000000000000000000000000000000000000000000000000087165af19283156101885760209493610159575b505191168152f35b61017a919350843d8111610181575b61017281836102f8565b81019061031a565b9138610151565b503d610168565b81513d86823e3d90fd5b5034610090578160031936011261009057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b91905034610297576101e63661029b565b92906bffffffffffffffffffffffff199060601b1660208201526014815261020d816102c6565b6102498251938492631bb12e6960e01b84527f000000000000000000000000000000000000000000000000000000000000000060048501610339565b6001600160a01b03929160209185919003817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610188576020949361015957505191168152f35b8280fd5b60409060031901126102c1576004356001600160a01b03811681036102c1579060243590565b600080fd5b6040810190811067ffffffffffffffff8211176102e257604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102e257604052565b908160209103126102c157516001600160a01b03811681036102c15790565b9392919060018060a01b03168452602060608186015281519182606087015260005b8381106103815750505060808160008260409488010152601f8019910116850101930152565b81810183015187820160800152820161035b5600000000000000000000000088546cc16ec33fd449fa929fb8ac900793018784000000000000000000000000e7044516dc4584e1ec3307e252e3a689800227bb" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xbb3a20da81d9d752f3e88c3acf252ba87b63cc472bc224b12c1f2075fb850851", + "transactionIndex": "0x5", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0xf1fc5", + "gasUsed": "0x54e44", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000001da5e68fe7c00000000000000000000000000000000000000000000000000153cce2ab6b2606a0000000000000000000000000000000000000000000021071cabdfa9fec153e4000000000000000000000000000000000000000000000000153af3cc4db3e46a0000000000000000000000000000000000000000000021071cadba0867bfcfe4", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "transactionHash": "0xbb3a20da81d9d752f3e88c3acf252ba87b63cc472bc224b12c1f2075fb850851", + "transactionIndex": "0x5", + "logIndex": "0x1c", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + }, + { + "transactionHash": "0xf9988164183bf47b6ed3453c83f51fbb0f979c8d65fd927bb2c8a4558b4b9685", + "transactionIndex": "0x7", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x33a79d", + "gasUsed": "0x1fb276", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x000000000000000000000000000000000000000000000000000b11f157b3aa00000000000000000000000000000000000000000000000000153af3cc4d5f002a0000000000000000000000000000000000000000000021071caf6a2f0cbccde4000000000000000000000000000000000000000000000000152fe1daf5ab562a0000000000000000000000000000000000000000000021071cba7c20647077e4", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "transactionHash": "0xf9988164183bf47b6ed3453c83f51fbb0f979c8d65fd927bb2c8a4558b4b9685", + "transactionIndex": "0x7", + "logIndex": "0x21", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + }, + { + "transactionHash": "0x1a0633e9e78bdc97a7deeea1d13cb06c1f5ec735e67ec75a388e6f57daf9d20b", + "transactionIndex": "0x8", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x38a372", + "gasUsed": "0x4fbd5", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000001bd9445c41b00000000000000000000000000000000000000000000000000152fe1daf3b02eca0000000000000000000000000000000000000000000021071cba7c20647077e4000000000000000000000000000000000000000000000000152e2446adec13ca0000000000000000000000000000000000000000000021071cbc39b4aa3492e4", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "transactionHash": "0x1a0633e9e78bdc97a7deeea1d13cb06c1f5ec735e67ec75a388e6f57daf9d20b", + "transactionIndex": "0x8", + "logIndex": "0x22", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + }, + { + "transactionHash": "0xbcd2ed240dd78712e82c3e68f587f396f781e9ee6bdfea2196b847ed9ee1db90", + "transactionIndex": "0x9", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "cumulativeGasUsed": "0x3c80c9", + "gasUsed": "0x3dd57", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x00000000000000000000000000000000000000000000000000015985dffaf900000000000000000000000000000000000000000000000000152e2446ad9c567a0000000000000000000000000000000000000000000021071cbc39b4aa3492e4000000000000000000000000000000000000000000000000152ccac0cda15d7a0000000000000000000000000000000000000000000021071cbd933a8a2f8be4", + "blockHash": "0x2dc761bbaeed43a752a8228bb0a2bb7c5330423c8a84ef7376e459e9749933ad", + "blockNumber": "0x24ae6db", + "transactionHash": "0xbcd2ed240dd78712e82c3e68f587f396f781e9ee6bdfea2196b847ed9ee1db90", + "transactionIndex": "0x9", + "logIndex": "0x23", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000020000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1690749009, + "chain": 80001, + "multi": false, + "commit": "199ae7d" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1691515307.json b/broadcast/DeployKernel.s.sol/80001/run-1691515307.json new file mode 100644 index 00000000..892d8b35 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1691515307.json @@ -0,0 +1,53 @@ +{ + "transactions": [ + { + "hash": "0x314be895ae55ffdd298f0136cb3c86d4dca1eed2c3b8dfb20eb4b227287b87e8", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x29c6538b755ed3054352a6b92177409f8a013da3cfaea434a850ea08d1c8e647", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x314be895ae55ffdd298f0136cb3c86d4dca1eed2c3b8dfb20eb4b227287b87e8", + "0x29c6538b755ed3054352a6b92177409f8a013da3cfaea434a850ea08d1c8e647" + ], + "returns": {}, + "timestamp": 1691515307, + "chain": 80001, + "multi": false, + "commit": "95addde" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1691515320.json b/broadcast/DeployKernel.s.sol/80001/run-1691515320.json new file mode 100644 index 00000000..08b37814 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1691515320.json @@ -0,0 +1,132 @@ +{ + "transactions": [ + { + "hash": "0x314be895ae55ffdd298f0136cb3c86d4dca1eed2c3b8dfb20eb4b227287b87e8", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x29c6538b755ed3054352a6b92177409f8a013da3cfaea434a850ea08d1c8e647", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x314be895ae55ffdd298f0136cb3c86d4dca1eed2c3b8dfb20eb4b227287b87e8", + "transactionIndex": "0x24", + "blockHash": "0x91d6f03c614f51248f2fa2c1a927f77a189226af65b600ad3eeaba95537e1830", + "blockNumber": "0x24fbd75", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x7572e6", + "gasUsed": "0x1a94a9", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + ], + "data": "0x00000000000000000000000000000000000000000000000000090542b117f710000000000000000000000000000000000000000000000000146536a47ee3569700000000000000000000000000000000000000000000104dbcf4202aa17c7521000000000000000000000000000000000000000000000000145c3161cdcb5f8700000000000000000000000000000000000000000000104dbcfd256d52946c31", + "blockHash": "0x91d6f03c614f51248f2fa2c1a927f77a189226af65b600ad3eeaba95537e1830", + "blockNumber": "0x24fbd75", + "transactionHash": "0x314be895ae55ffdd298f0136cb3c86d4dca1eed2c3b8dfb20eb4b227287b87e8", + "transactionIndex": "0x24", + "logIndex": "0xa4", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x56e0989f" + }, + { + "transactionHash": "0x29c6538b755ed3054352a6b92177409f8a013da3cfaea434a850ea08d1c8e647", + "transactionIndex": "0x25", + "blockHash": "0x91d6f03c614f51248f2fa2c1a927f77a189226af65b600ad3eeaba95537e1830", + "blockNumber": "0x24fbd75", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x7f95f3", + "gasUsed": "0xa230d", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x91d6f03c614f51248f2fa2c1a927f77a189226af65b600ad3eeaba95537e1830", + "blockNumber": "0x24fbd75", + "transactionHash": "0x29c6538b755ed3054352a6b92177409f8a013da3cfaea434a850ea08d1c8e647", + "transactionIndex": "0x25", + "logIndex": "0xa5", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + ], + "data": "0x000000000000000000000000000000000000000000000000000370ab13e36f50000000000000000000000000000000000000000000000000145c3161cc3ca9a000000000000000000000000000000000000000000000104dbcfd256d52946c310000000000000000000000000000000000000000000000001458c0b6b8593a5000000000000000000000000000000000000000000000104dbd0096186677db81", + "blockHash": "0x91d6f03c614f51248f2fa2c1a927f77a189226af65b600ad3eeaba95537e1830", + "blockNumber": "0x24fbd75", + "transactionHash": "0x29c6538b755ed3054352a6b92177409f8a013da3cfaea434a850ea08d1c8e647", + "transactionIndex": "0x25", + "logIndex": "0xa6", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800001000000000000000110000000000200000000020000000000000000000800000000000000000080000000000000400000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000080000000000004000000000000000000001000000000000000000000000000000100000001020000000000000000000000000000000000000000000000000000000000200100000", + "type": "0x0", + "effectiveGasPrice": "0x56e0989f" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691515320, + "chain": 80001, + "multi": false, + "commit": "95addde" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1691515779.json b/broadcast/DeployKernel.s.sol/80001/run-1691515779.json new file mode 100644 index 00000000..bd621e67 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1691515779.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058" + ], + "returns": {}, + "timestamp": 1691515779, + "chain": 80001, + "multi": false, + "commit": "95addde" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1691515785.json b/broadcast/DeployKernel.s.sol/80001/run-1691515785.json new file mode 100644 index 00000000..a3557be5 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1691515785.json @@ -0,0 +1,111 @@ +{ + "transactions": [ + { + "hash": "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058", + "transactionIndex": "0x1b", + "blockHash": "0x2072a740eb5d01f54ecb0a314ce2ab3428ef6e0c58aaa3ecceb6789f478371cc", + "blockNumber": "0x24fbe2c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x3f6450", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000014581ff258d0871e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014581ff258d0871d0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x2072a740eb5d01f54ecb0a314ce2ab3428ef6e0c58aaa3ecceb6789f478371cc", + "blockNumber": "0x24fbe2c", + "transactionHash": "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058", + "transactionIndex": "0x1b", + "logIndex": "0x7c", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000009041dfa1e9dc475b48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009041dfa1e9dc475b49", + "blockHash": "0x2072a740eb5d01f54ecb0a314ce2ab3428ef6e0c58aaa3ecceb6789f478371cc", + "blockNumber": "0x24fbe2c", + "transactionHash": "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058", + "transactionIndex": "0x1b", + "logIndex": "0x7d", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x2072a740eb5d01f54ecb0a314ce2ab3428ef6e0c58aaa3ecceb6789f478371cc", + "blockNumber": "0x24fbe2c", + "transactionHash": "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058", + "transactionIndex": "0x1b", + "logIndex": "0x7e", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + ], + "data": "0x00000000000000000000000000000000000000000000000000006ded25461fa40000000000000000000000000000000000000000000000001458c0b6b7c12c8d00000000000000000000000000000000000000000000104dd3240ec165ee9685000000000000000000000000000000000000000000000000145852c9927b0ce900000000000000000000000000000000000000000000104dd3247cae8b34b629", + "blockHash": "0x2072a740eb5d01f54ecb0a314ce2ab3428ef6e0c58aaa3ecceb6789f478371cc", + "blockNumber": "0x24fbe2c", + "transactionHash": "0x1f4b33237a92b3f848a43afc6346f7ee23436e04edce6510503d439045197058", + "transactionIndex": "0x1b", + "logIndex": "0x7f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000010000000000000000000000020000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000000000000080000000000241000000000000000000000000000000000000000000000000002000000004000000000000000000001001000000000000040000000800000108000001000000100000000000000000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x56bede15" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691515785, + "chain": 80001, + "multi": false, + "commit": "95addde" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1691517538.json b/broadcast/DeployKernel.s.sol/80001/run-1691517538.json new file mode 100644 index 00000000..95ba1519 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1691517538.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe4" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe" + ], + "returns": {}, + "timestamp": 1691517538, + "chain": 80001, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1691517545.json b/broadcast/DeployKernel.s.sol/80001/run-1691517545.json new file mode 100644 index 00000000..15610317 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1691517545.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe4" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", + "transactionIndex": "0x1d", + "blockHash": "0x25de694995c671749e9005775d6fe88e01f3b6e6da92360b28131e4fd259af66", + "blockNumber": "0x24fc0ed", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x46d41e", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + ], + "data": "0x00000000000000000000000000000000000000000000000000003f58e31cfe000000000000000000000000000000000000000000000000001453449ef89aa24f00000000000000000000000000000000000000000000104e05fb33993489c61000000000000000000000000000000000000000000000000014530546157da44f00000000000000000000000000000000000000000000104e05fb72f217a6c410", + "blockHash": "0x25de694995c671749e9005775d6fe88e01f3b6e6da92360b28131e4fd259af66", + "blockNumber": "0x24fc0ed", + "transactionHash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", + "transactionIndex": "0x1d", + "logIndex": "0xaa", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f11" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691517545, + "chain": 80001, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json index bec66f08..15610317 100644 --- a/broadcast/DeployKernel.s.sol/80001/run-latest.json +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -1,109 +1,35 @@ { "transactions": [ { - "hash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", + "hash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", "transactionType": "CALL", "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x579d3c", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x35" + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe4" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", - "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", - "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", - "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "function": null, - "arguments": null, - "transaction": { - "type": "0x00", - "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x54e89", - "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x36" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", - "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false } ], "receipts": [ { - "transactionHash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", - "transactionIndex": "0x0", - "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", - "blockNumber": "0x2419989", - "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x3f6e5d", - "gasUsed": "0x3f6e5d", - "contractAddress": null, - "logs": [ - { - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" - ], - "data": "0x0000000000000000000000000000000000000000000000000016272ed00b13000000000000000000000000000000000000000000000000000e6ae0a233f263160000000000000000000000000000000000000000000032fcd83473677dacbdc50000000000000000000000000000000000000000000000000e54b97363e750160000000000000000000000000000000000000000000032fcd84a9a964db7d0c5", - "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", - "blockNumber": "0x2419989", - "transactionHash": "0xa2a4c692f4b80c93d24bc8128f0cc276619fa86aea99553ed35784c02175aa74", - "transactionIndex": "0x0", - "logIndex": "0x0", - "removed": false - } - ], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", - "type": "0x0", - "effectiveGasPrice": "0x59682f11" - }, - { - "transactionHash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", - "transactionIndex": "0x1", - "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", - "blockNumber": "0x2419989", + "transactionHash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", + "transactionIndex": "0x1d", + "blockHash": "0x25de694995c671749e9005775d6fe88e01f3b6e6da92360b28131e4fd259af66", + "blockNumber": "0x24fc0ed", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x4345ec", - "gasUsed": "0x3d78f", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x46d41e", + "gasUsed": "0xb562", "contractAddress": null, "logs": [ { @@ -112,19 +38,19 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" ], - "data": "0x00000000000000000000000000000000000000000000000000015780fdab41000000000000000000000000000000000000000000000000000e54b9735fb0fbe90000000000000000000000000000000000000000000032fcd84a9a964db7d0c50000000000000000000000000000000000000000000000000e5361f26205bae90000000000000000000000000000000000000000000032fcd84bf2174b6311c5", - "blockHash": "0x06f342d9946eaecdc306d197ab27a9f720ae81548c7120bdf14d55ed3aef2408", - "blockNumber": "0x2419989", - "transactionHash": "0x2e8c55abc96c5c8e25ae85bc75e48ca92d777f3762f17c77b97a693e69bb8287", - "transactionIndex": "0x1", - "logIndex": "0x1", + "data": "0x00000000000000000000000000000000000000000000000000003f58e31cfe000000000000000000000000000000000000000000000000001453449ef89aa24f00000000000000000000000000000000000000000000104e05fb33993489c61000000000000000000000000000000000000000000000000014530546157da44f00000000000000000000000000000000000000000000104e05fb72f217a6c410", + "blockHash": "0x25de694995c671749e9005775d6fe88e01f3b6e6da92360b28131e4fd259af66", + "blockNumber": "0x24fc0ed", + "transactionHash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", + "transactionIndex": "0x1d", + "logIndex": "0xaa", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", "effectiveGasPrice": "0x59682f11" } @@ -132,8 +58,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1689176015, + "timestamp": 1691517545, "chain": 80001, "multi": false, - "commit": "ccc01a6" + "commit": "06a62a2" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/84531/run-1691520712.json b/broadcast/DeployKernel.s.sol/84531/run-1691520712.json new file mode 100644 index 00000000..cccc7863 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/84531/run-1691520712.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd" + ], + "returns": {}, + "timestamp": 1691520712, + "chain": 84531, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/84531/run-1691520719.json b/broadcast/DeployKernel.s.sol/84531/run-1691520719.json new file mode 100644 index 00000000..fefb29af --- /dev/null +++ b/broadcast/DeployKernel.s.sol/84531/run-1691520719.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "transactionIndex": "0x1", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b4bd2", + "gasUsed": "0x1a94a9", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionIndex": "0x2", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x256edf", + "gasUsed": "0xa230d", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "transactionHash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "transactionIndex": "0x3", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x262441", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionIndex": "0x4", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x2768aa", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "transactionHash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520719, + "chain": 84531, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/84531/run-latest.json b/broadcast/DeployKernel.s.sol/84531/run-latest.json new file mode 100644 index 00000000..fefb29af --- /dev/null +++ b/broadcast/DeployKernel.s.sol/84531/run-latest.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26dfd0", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xe0068", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "transactionIndex": "0x1", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b4bd2", + "gasUsed": "0x1a94a9", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionIndex": "0x2", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x256edf", + "gasUsed": "0xa230d", + "contractAddress": null, + "logs": [ + { + "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "transactionHash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "transactionIndex": "0x3", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x262441", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionIndex": "0x4", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "cumulativeGasUsed": "0x2768aa", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", + "blockNumber": "0x7c90de", + "transactionHash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520719, + "chain": 84531, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10200/run-1691520839.json b/broadcast/DeploySessionKey.s.sol/10200/run-1691520839.json new file mode 100644 index 00000000..2e8a2da1 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10200/run-1691520839.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4" + ], + "returns": {}, + "timestamp": 1691520839, + "chain": 10200, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10200/run-1691520846.json b/broadcast/DeploySessionKey.s.sol/10200/run-1691520846.json new file mode 100644 index 00000000..26a446b9 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10200/run-1691520846.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4", + "transactionIndex": "0x2", + "blockHash": "0xff82e1859f7f22ec177d30db47ce99bc7c846bc18a7ed5de3f6f93ea9f4bca3f", + "blockNumber": "0x52714d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf51d0", + "gasUsed": "0xe7aa0", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520846, + "chain": 10200, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10200/run-latest.json b/broadcast/DeploySessionKey.s.sol/10200/run-latest.json new file mode 100644 index 00000000..26a446b9 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10200/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4", + "transactionIndex": "0x2", + "blockHash": "0xff82e1859f7f22ec177d30db47ce99bc7c846bc18a7ed5de3f6f93ea9f4bca3f", + "blockNumber": "0x52714d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf51d0", + "gasUsed": "0xe7aa0", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520846, + "chain": 10200, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/420/run-1691518119.json b/broadcast/DeploySessionKey.s.sol/420/run-1691518119.json new file mode 100644 index 00000000..eab5e1c7 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/420/run-1691518119.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295" + ], + "returns": {}, + "timestamp": 1691518119, + "chain": 420, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/420/run-1691518126.json b/broadcast/DeploySessionKey.s.sol/420/run-1691518126.json new file mode 100644 index 00000000..57541b9f --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/420/run-1691518126.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295", + "transactionIndex": "0x1", + "blockHash": "0xf5f204cfd538d0416aa8e1eb946acca1cae5e70d99acdc8fc36e9272e951dfb3", + "blockNumber": "0xc70d22", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf30c3", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518126, + "chain": 420, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/420/run-latest.json b/broadcast/DeploySessionKey.s.sol/420/run-latest.json new file mode 100644 index 00000000..57541b9f --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/420/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295", + "transactionIndex": "0x1", + "blockHash": "0xf5f204cfd538d0416aa8e1eb946acca1cae5e70d99acdc8fc36e9272e951dfb3", + "blockNumber": "0xc70d22", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf30c3", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e34" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691518126, + "chain": 420, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/421613/run-1691520310.json b/broadcast/DeploySessionKey.s.sol/421613/run-1691520310.json new file mode 100644 index 00000000..a0778419 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/421613/run-1691520310.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xc9ab82ff9492897aaf27fbced8e28a9c215b52f467abd4caa6b8a0db7dd0c148", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1313c9", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xc9ab82ff9492897aaf27fbced8e28a9c215b52f467abd4caa6b8a0db7dd0c148", + "transactionIndex": "0x1", + "blockHash": "0x102fe427bc0cd00b9d3acaa3f269b22d8f3035f7c4859c0b5402bda4f8c51b2b", + "blockNumber": "0x1fead1b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe799a", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5aaedfd00" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520310, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/421613/run-latest.json b/broadcast/DeploySessionKey.s.sol/421613/run-latest.json new file mode 100644 index 00000000..a0778419 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/421613/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xc9ab82ff9492897aaf27fbced8e28a9c215b52f467abd4caa6b8a0db7dd0c148", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1313c9", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xc9ab82ff9492897aaf27fbced8e28a9c215b52f467abd4caa6b8a0db7dd0c148", + "transactionIndex": "0x1", + "blockHash": "0x102fe427bc0cd00b9d3acaa3f269b22d8f3035f7c4859c0b5402bda4f8c51b2b", + "blockNumber": "0x1fead1b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe799a", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5aaedfd00" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520310, + "chain": 421613, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43113/run-1691520636.json b/broadcast/DeploySessionKey.s.sol/43113/run-1691520636.json new file mode 100644 index 00000000..1a6b1b3b --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43113/run-1691520636.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4" + ], + "returns": {}, + "timestamp": 1691520636, + "chain": 43113, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43113/run-1691520642.json b/broadcast/DeploySessionKey.s.sol/43113/run-1691520642.json new file mode 100644 index 00000000..5e3fe7cd --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43113/run-1691520642.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4", + "transactionIndex": "0x0", + "blockHash": "0x6b45ca86d1221d6800f2350f1d193d3b3d68387c390086d15f7575b3213ecf9a", + "blockNumber": "0x17b4492", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe799a", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520642, + "chain": 43113, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43113/run-latest.json b/broadcast/DeploySessionKey.s.sol/43113/run-latest.json new file mode 100644 index 00000000..5e3fe7cd --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43113/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4", + "transactionIndex": "0x0", + "blockHash": "0x6b45ca86d1221d6800f2350f1d193d3b3d68387c390086d15f7575b3213ecf9a", + "blockNumber": "0x17b4492", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe799a", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520642, + "chain": 43113, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/5/run-1691517851.json b/broadcast/DeploySessionKey.s.sol/5/run-1691517851.json new file mode 100644 index 00000000..46ef7f2f --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/5/run-1691517851.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x45" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01" + ], + "returns": {}, + "timestamp": 1691517851, + "chain": 5, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/5/run-1691517870.json b/broadcast/DeploySessionKey.s.sol/5/run-1691517870.json new file mode 100644 index 00000000..d170fe78 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/5/run-1691517870.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x45" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01", + "transactionIndex": "0x3d", + "blockHash": "0xfcf73eb43bae1ae11a19a89063596aa0306132c86130fda5fadb60b9fd944f8e", + "blockNumber": "0x90b813", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xef4dd6", + "gasUsed": "0xe7aa0", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x48a74148" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691517870, + "chain": 5, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/5/run-latest.json b/broadcast/DeploySessionKey.s.sol/5/run-latest.json new file mode 100644 index 00000000..d170fe78 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/5/run-latest.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x45" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01", + "transactionIndex": "0x3d", + "blockHash": "0xfcf73eb43bae1ae11a19a89063596aa0306132c86130fda5fadb60b9fd944f8e", + "blockNumber": "0x90b813", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xef4dd6", + "gasUsed": "0xe7aa0", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x48a74148" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691517870, + "chain": 5, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-1691516556.json b/broadcast/DeploySessionKey.s.sol/80001/run-1691516556.json new file mode 100644 index 00000000..b260743e --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/80001/run-1691516556.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582" + ], + "returns": {}, + "timestamp": 1691516556, + "chain": 80001, + "multi": false, + "commit": "3c4d8e8" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-1691516563.json b/broadcast/DeploySessionKey.s.sol/80001/run-1691516563.json new file mode 100644 index 00000000..d1a3e492 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/80001/run-1691516563.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "transactionIndex": "0x10", + "blockHash": "0x3f08dfa76fd56ff482afd5a4c1130002c0ca5ba7e81b9885476269da91cd98db", + "blockNumber": "0x24fbf66", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x32f174", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + ], + "data": "0x00000000000000000000000000000000000000000000000000050e2a98e34600000000000000000000000000000000000000000000000000145852c9926581ef00000000000000000000000000000000000000000000104dee61b5522b47e3680000000000000000000000000000000000000000000000001453449ef9823bef00000000000000000000000000000000000000000000104dee66c37cc42b2968", + "blockHash": "0x3f08dfa76fd56ff482afd5a4c1130002c0ca5ba7e81b9885476269da91cd98db", + "blockNumber": "0x24fbf66", + "transactionHash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "transactionIndex": "0x10", + "logIndex": "0x4a", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691516563, + "chain": 80001, + "multi": false, + "commit": "3c4d8e8" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-latest.json b/broadcast/DeploySessionKey.s.sol/80001/run-latest.json index 44963525..d1a3e492 100644 --- a/broadcast/DeploySessionKey.s.sol/80001/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/80001/run-latest.json @@ -1,94 +1,35 @@ { "transactions": [ { - "hash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", - "transactionType": "CREATE", - "contractName": "ERC721Actions", - "contractAddress": "0xc5580411041d96EC591d7fa4C57638E29F084b89", + "hash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", "function": null, "arguments": null, "transaction": { - "type": "0x02", + "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "gas": "0x22261", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", "value": "0x0", - "data": "0x608060405234801561001057600080fd5b5060fb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80631888bfd714602d575b600080fd5b603c603836600460c4565b603e565b005b6040516323b872dd60e01b81523060048201526001600160a01b038281166024830152604482018490528416906323b872dd90606401600060405180830381600087803b158015608d57600080fd5b505af115801560a0573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811460bf57600080fd5b919050565b60008060006060848603121560d857600080fd5b60df8460a9565b92506020840135915060f26040850160a9565b9050925092509256", - "nonce": "0x31", - "accessList": [] + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe3" }, "additionalContracts": [], "isFixedGasLimit": false - }, - { - "hash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "function": null, - "arguments": null, - "transaction": { - "type": "0x02", - "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x102c59", - "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89", - "nonce": "0x32", - "accessList": [] - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0xBd2EbA64275AA098D61420a75e30a3cE4B3D5F04", - "initCode": "608060405234801561001057600080fd5b50610c21806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c578063333daf92146100715780633a871cdd146100975780638fc925aa146100aa57806396ade1f9146100bd575b600080fd5b61006f61006a366004610969565b610179565b005b61008461007f3660046109ab565b61034c565b6040519081526020015b60405180910390f35b6100846100a53660046109f7565b61038e565b61006f6100b8366004610969565b610668565b61012c6100cb366004610a67565b600060208181529281526040808220909352908152205460ff811690610100810460e090811b9165010000000000810490911b9065ffffffffffff600160481b8204811691600160781b81049091169063ffffffff600160a81b9091041686565b6040805196151587526001600160e01b03199586166020880152939094169285019290925265ffffffffffff908116606085015216608083015263ffffffff1660a082015260c00161008e565b60006101886014828486610a9a565b61019191610ac4565b60601c905060006101a6601860148587610a9a565b6101af91610af9565b905060006101c1601c60188688610a9a565b6101ca91610af9565b905060006101dc6022601c8789610a9a565b6101e591610b27565b60d01c905060006101fa60286022888a610a9a565b61020391610b27565b60d01c90506000610218602c6028898b610a9a565b61022191610af9565b6040805160c081018252600181526001600160e01b031996871660208083019182529890971681830190815265ffffffffffff968716606083019081529587166080830190815260e094851c60a084019081526001600160a01b039b909b166000908152808b52848120338252909a5292909820905181549751985195519251995164ffffffffff1990981690151564ffffffff0019161761010098841c98909802979097176effffffffffffffffffff00000000001916650100000000009490921c939093026effffffffffff000000000000000000191617600160481b928416929092029190911769ffffffffffffffffffff60781b1916600160781b959092169490940263ffffffff60a81b191617600160a81b63ffffffff90921691909102179055505050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064015b60405180910390fd5b6000806103e8846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000610438826103fe610140890189610b55565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506106ad92505050565b6001600160a01b03811660009081526020818152604082209293509091908290610464908a018a610b9c565b6001600160a01b031681526020810191909152604001600020805490915060ff166104955760019350505050610661565b8054610100900460e01b6001600160e01b0319166104b66060890189610b55565b6104c591600491600091610a9a565b6104ce91610af9565b6001600160e01b0319161461051e5760405162461bcd60e51b81526020600482015260166024820152753737ba1039bab83837b93a32b21039b2b632b1ba37b960511b6044820152606401610385565b600061052d6060890189610b55565b8354600160a81b900463ffffffff1690610548826014610bb7565b63ffffffff169261055b93929190610a9a565b61056491610ac4565b82546040516301ffc9a760e01b81526501000000000090910460e01b6001600160e01b031916600482015260609190911c915081906301ffc9a790602401602060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610be9565b61062f5760405162461bcd60e51b815260206004820152601a60248201527f646f6573206e6f7420737570706f727420696e746572666163650000000000006044820152606401610385565b5054600160481b810460d01b6001600160d01b031916600160781b90910460a01b65ffffffffffff60a01b1617925050505b9392505050565b60006106776014828486610a9a565b61068091610ac4565b60601c600090815260208181526040808320338452909152902080546001600160c81b0319169055505050565b60008060006106bc85856106d1565b915091506106c981610716565b509392505050565b60008082516041036107075760208301516040840151606085015160001a6106fb87828585610863565b9450945050505061070f565b506000905060025b9250929050565b600081600481111561072a5761072a610c0b565b036107325750565b600181600481111561074657610746610c0b565b036107935760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610385565b60028160048111156107a7576107a7610c0b565b036107f45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610385565b600381600481111561080857610808610c0b565b036108605760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610385565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561089a575060009050600361091e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109175760006001925092505061091e565b9150600090505b94509492505050565b60008083601f84011261093957600080fd5b50813567ffffffffffffffff81111561095157600080fd5b60208301915083602082850101111561070f57600080fd5b6000806020838503121561097c57600080fd5b823567ffffffffffffffff81111561099357600080fd5b61099f85828601610927565b90969095509350505050565b6000806000604084860312156109c057600080fd5b83359250602084013567ffffffffffffffff8111156109de57600080fd5b6109ea86828701610927565b9497909650939450505050565b600080600060608486031215610a0c57600080fd5b833567ffffffffffffffff811115610a2357600080fd5b84016101608187031215610a3657600080fd5b95602085013595506040909401359392505050565b80356001600160a01b0381168114610a6257600080fd5b919050565b60008060408385031215610a7a57600080fd5b610a8383610a4b565b9150610a9160208401610a4b565b90509250929050565b60008085851115610aaa57600080fd5b83861115610ab757600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015610af15780818660140360031b1b83161692505b505092915050565b6001600160e01b03198135818116916004851015610af15760049490940360031b84901b1690921692915050565b6001600160d01b03198135818116916006851015610af15760069490940360031b84901b1690921692915050565b6000808335601e19843603018112610b6c57600080fd5b83018035915067ffffffffffffffff821115610b8757600080fd5b60200191503681900382131561070f57600080fd5b600060208284031215610bae57600080fd5b61066182610a4b565b63ffffffff818116838216019080821115610be257634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215610bfb57600080fd5b8151801515811461066157600080fd5b634e487b7160e01b600052602160045260246000fd000000000000000000000000c5580411041d96ec591d7fa4c57638e29f084b89" - } - ], - "isFixedGasLimit": false } ], "receipts": [ { - "transactionHash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", - "transactionIndex": "0x1", - "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", - "blockNumber": "0x229e5bd", - "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": null, - "cumulativeGasUsed": "0x86d24", - "gasUsed": "0x1a44b", - "contractAddress": "0xc5580411041d96EC591d7fa4C57638E29F084b89", - "logs": [ - { - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" - ], - "data": "0x0000000000000000000000000000000000000000000000000000c3b6d36817500000000000000000000000000000000000000000000000000e744bd345e04e6c000000000000000000000000000000000000000000000a102d87c1768e870a300000000000000000000000000000000000000000000000000e73881c7278371c000000000000000000000000000000000000000000000a102d88852d61ef2180", - "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", - "blockNumber": "0x229e5bd", - "transactionHash": "0x9ca482e48e697745e5cdaf253ea370103c47ef0d956e98c7fb168045a0b7ec03", - "transactionIndex": "0x1", - "logIndex": "0x9", - "removed": false - } - ], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "type": "0x2", - "effectiveGasPrice": "0x77359400" - }, - { - "transactionHash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", - "transactionIndex": "0x2", - "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", - "blockNumber": "0x229e5bd", + "transactionHash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "transactionIndex": "0x10", + "blockHash": "0x3f08dfa76fd56ff482afd5a4c1130002c0ca5ba7e81b9885476269da91cd98db", + "blockNumber": "0x24fbf66", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x137c26", - "gasUsed": "0xb0f02", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x32f174", + "gasUsed": "0xe799a", "contractAddress": null, "logs": [ { @@ -97,28 +38,28 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" + "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" ], - "data": "0x0000000000000000000000000000000000000000000000000005264a6d6637e00000000000000000000000000000000000000000000000000e73881c725df26c000000000000000000000000000000000000000000000a102d88852d61ef21800000000000000000000000000000000000000000000000000e6e61d204f7ba8c000000000000000000000000000000000000000000000a102d8dab77cf555960", - "blockHash": "0x8a3f853d698bcb5fd1a53be1e5f0c748e0d7d03267755961da78fe42fe986842", - "blockNumber": "0x229e5bd", - "transactionHash": "0xe3770ecf0a7b9f608efe64127c035446fdbccba7319f8040f04716a988d76d1a", - "transactionIndex": "0x2", - "logIndex": "0xa", + "data": "0x00000000000000000000000000000000000000000000000000050e2a98e34600000000000000000000000000000000000000000000000000145852c9926581ef00000000000000000000000000000000000000000000104dee61b5522b47e3680000000000000000000000000000000000000000000000001453449ef9823bef00000000000000000000000000000000000000000000104dee66c37cc42b2968", + "blockHash": "0x3f08dfa76fd56ff482afd5a4c1130002c0ca5ba7e81b9885476269da91cd98db", + "blockNumber": "0x24fbf66", + "transactionHash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "transactionIndex": "0x10", + "logIndex": "0x4a", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000080000000000000000000000000000000000000000004000000000000000000001000000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "type": "0x2", - "effectiveGasPrice": "0x77359400" + "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1685599444, + "timestamp": 1691516563, "chain": 80001, "multi": false, - "commit": "1bfa1a7" + "commit": "3c4d8e8" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/84531/run-1691520676.json b/broadcast/DeploySessionKey.s.sol/84531/run-1691520676.json new file mode 100644 index 00000000..60a6b10c --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/84531/run-1691520676.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2" + ], + "returns": {}, + "timestamp": 1691520676, + "chain": 84531, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/84531/run-1691520682.json b/broadcast/DeploySessionKey.s.sol/84531/run-1691520682.json new file mode 100644 index 00000000..4f4d80b5 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/84531/run-1691520682.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2", + "transactionIndex": "0x1", + "blockHash": "0xbabbbea871abb966b5e6131be74d559c7f37e205ba85931cfe04c6a3f01e0bb6", + "blockNumber": "0x7c90cc", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf30c3", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520682, + "chain": 84531, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/84531/run-latest.json b/broadcast/DeploySessionKey.s.sol/84531/run-latest.json new file mode 100644 index 00000000..4f4d80b5 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/84531/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x152b70", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2", + "transactionIndex": "0x1", + "blockHash": "0xbabbbea871abb966b5e6131be74d559c7f37e205ba85931cfe04c6a3f01e0bb6", + "blockNumber": "0x7c90cc", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf30c3", + "gasUsed": "0xe799a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1691520682, + "chain": 84531, + "multi": false, + "commit": "06a62a2" +} \ No newline at end of file diff --git a/bytes b/bytes new file mode 100644 index 00000000..88441a29 --- /dev/null +++ b/bytes @@ -0,0 +1,9 @@ +0x51945447 +000000000000000000000000c7183455a4c133ae270771860664b6b7ec320bb1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000080 +0000000000000000000000000000000000000000000000000000000000000001 +0000000000000000000000000000000000000000000000000000000000000044 +a9059cbb0000000000000000000000005c4d2bd3510c8b51edb17766d3c96ec6 +3732699900000000000000000000000000000000000000000000000000000000 +0000006400000000000000000000000000000000000000000000000000000000 diff --git a/foundry.toml b/foundry.toml index 94b88e8e..2a88ba29 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,6 +7,9 @@ solc_version = '0.8.19' bytecode_hash = "none" cbor_metadata = false optimize = true +via-ir = true runs = 1000000 +gas_reports=["Kernel","KernelLiteECDSA","KernelFactory"] + # See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/gas/ecdsa/report-lite.txt b/gas/ecdsa/report-lite.txt new file mode 100644 index 00000000..bd7680bd --- /dev/null +++ b/gas/ecdsa/report-lite.txt @@ -0,0 +1,40 @@ +No files changed, compilation skipped + +Running 8 tests for test/foundry/KernelLite.t.sol:KernelTest +[PASS] test_disable_mode() (gas: 171425) +[PASS] test_external_call_default() (gas: 22953) +[PASS] test_external_call_execution() (gas: 439687) +[PASS] test_initialize_twice() (gas: 20968) +[PASS] test_set_default_validator() (gas: 369789) +[PASS] test_set_execution() (gas: 400852) +[PASS] test_validate_signature() (gas: 139666) +[PASS] test_validate_userOp() (gas: 1733019) +Test result: ok. 8 passed; 0 failed; 0 skipped; finished in 2.73ms +| src/factory/KernelFactory.sol:KernelFactory contract | | | | | | +|------------------------------------------------------|-----------------|--------|--------|--------|---------| +| Deployment Cost | Deployment Size | | | | | +| 594023 | 3050 | | | | | +| Function Name | min | avg | median | max | # calls | +| createAccount | 106913 | 107413 | 106913 | 111413 | 9 | +| deployDeterministicAndCall | 105350 | 105627 | 105350 | 107850 | 9 | +| setImplementation | 22862 | 22862 | 22862 | 22862 | 8 | + + +| src/lite/KernelLiteECDSA.sol:KernelLiteECDSA contract | | | | | | +|-------------------------------------------------------|-----------------|-------|--------|-------|---------| +| Deployment Cost | Deployment Size | | | | | +| 1598398 | 8392 | | | | | +| Function Name | min | avg | median | max | # calls | +| disableMode | 22865 | 22865 | 22865 | 22865 | 1 | +| getDefaultValidator | 341 | 341 | 341 | 341 | 1 | +| getDisabledMode | 577 | 577 | 577 | 577 | 1 | +| getExecution | 1249 | 1249 | 1249 | 1249 | 2 | +| initialize | 3117 | 21073 | 23069 | 23069 | 10 | +| isValidSignature | 8587 | 8587 | 8587 | 8587 | 1 | +| setDefaultValidator | 26774 | 26774 | 26774 | 26774 | 1 | +| setExecution | 49853 | 49853 | 49853 | 49853 | 2 | +| validateUserOp | 36049 | 36049 | 36049 | 36049 | 4 | + + + +Ran 1 test suites: 8 tests passed, 0 failed, 0 skipped (8 total tests) diff --git a/gas/ecdsa/report.txt b/gas/ecdsa/report.txt new file mode 100644 index 00000000..c557c241 --- /dev/null +++ b/gas/ecdsa/report.txt @@ -0,0 +1,39 @@ +No files changed, compilation skipped + +Running 8 tests for test/foundry/Kernel.t.sol:KernelTest +[PASS] test_disable_mode() (gas: 162572) +[PASS] test_external_call_default() (gas: 28889) +[PASS] test_external_call_execution() (gas: 453074) +[PASS] test_initialize_twice() (gas: 20907) +[PASS] test_set_default_validator() (gas: 361045) +[PASS] test_set_execution() (gas: 411379) +[PASS] test_validate_signature() (gas: 163724) +[PASS] test_validate_userOp() (gas: 1704261) +Test result: ok. 8 passed; 0 failed; 0 skipped; finished in 2.89ms +| src/Kernel.sol:Kernel contract | | | | | | +|--------------------------------|-----------------|-------|--------|-------|---------| +| Deployment Cost | Deployment Size | | | | | +| 1561763 | 8209 | | | | | +| Function Name | min | avg | median | max | # calls | +| disableMode | 3765 | 3765 | 3765 | 3765 | 1 | +| getDefaultValidator | 341 | 341 | 341 | 341 | 1 | +| getDisabledMode | 577 | 577 | 577 | 577 | 1 | +| getExecution | 1249 | 1249 | 1249 | 1249 | 2 | +| initialize | 3046 | 43982 | 48253 | 50753 | 10 | +| isValidSignature | 6047 | 6047 | 6047 | 6047 | 1 | +| setDefaultValidator | 7870 | 7870 | 7870 | 7870 | 1 | +| setExecution | 49874 | 49874 | 49874 | 49874 | 2 | +| validateUserOp | 45773 | 45967 | 45989 | 46119 | 4 | + + +| src/factory/KernelFactory.sol:KernelFactory contract | | | | | | +|------------------------------------------------------|-----------------|--------|--------|--------|---------| +| Deployment Cost | Deployment Size | | | | | +| 564969 | 2862 | | | | | +| Function Name | min | avg | median | max | # calls | +| createAccount | 130989 | 131766 | 130989 | 137989 | 9 | +| setImplementation | 22862 | 22862 | 22862 | 22862 | 8 | + + + +Ran 1 test suites: 8 tests passed, 0 failed, 0 skipped (8 total tests) diff --git a/gas/gas_report.sh b/gas/gas_report.sh new file mode 100755 index 00000000..a0b13430 --- /dev/null +++ b/gas/gas_report.sh @@ -0,0 +1,2 @@ +forge build +forge test --gas-report --match-path test/foundry/Kernel.t.sol > gas/ecdsa/report.txt diff --git a/lib/account-abstraction b/lib/account-abstraction index abff2aca..12be13e2 160000 --- a/lib/account-abstraction +++ b/lib/account-abstraction @@ -1 +1 @@ -Subproject commit abff2aca61a8f0934e533d0d352978055fddbd96 +Subproject commit 12be13e2e97b763e1ef294602b3f2072bc301443 diff --git a/package.json b/package.json index 8019e21e..59361532 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@zerodevapp/contracts", "description": "ZeroDev Account Abstraction (EIP 4337) contracts", "main": "./dist/index.js", - "version": "4.0.0-beta.14", + "version": "4.0.0-beta.10", "scripts": { "prepack": "./scripts/prepack-contracts-package.sh", "postpack": "./scripts/postpack-contracts-package.sh" diff --git a/remappings.txt b/remappings.txt index 8ca1b2ea..57bb3bbd 100644 --- a/remappings.txt +++ b/remappings.txt @@ -2,4 +2,5 @@ account-abstraction/=lib/account-abstraction/contracts/ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ openzeppelin-contracts/=lib/openzeppelin-contracts/ -@openzeppelin/=lib/openzeppelin-contracts/ +@openzeppelin/=lib/openzeppelin-contracts +solady/=lib/solady/src/ diff --git a/scripts/DeployKernel.s.sol b/scripts/DeployKernel.s.sol index 47cb2dc1..b91154a3 100644 --- a/scripts/DeployKernel.s.sol +++ b/scripts/DeployKernel.s.sol @@ -2,34 +2,41 @@ pragma solidity ^0.8.0; import "src/factory/KernelFactory.sol"; import "src/validator/ECDSAValidator.sol"; -import "src/factory/ECDSAKernelFactory.sol"; +import "account-abstraction/interfaces/IStakeManager.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; contract DeployKernel is Script { - address internal constant DETERMINISTIC_CREATE2_FACTORY = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; + address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; + address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; + address constant EXPECTED_KERNEL_ADDRESS = 0xD2063bE7C610eb55492C05385743edDbf5b6B951; + address constant EXPECTED_KERNEL_FACTORY_ADDRESS = 0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50; function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); - bytes memory bytecode = type(KernelFactory).creationCode; - bool success; - bytes memory returnData; - (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); - require(success, "Failed to deploy KernelFactory"); - console.logBytes(returnData); - address kernelFactory = address(bytes20(returnData)); - console.log("KernelFactory deployed at: %s", kernelFactory); - - bytecode = type(ECDSAValidator).creationCode; - (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode)); - require(success, "Failed to deploy ECDSAValidator"); - address validator = address(bytes20(returnData)); - console.log("ECDSAValidator deployed at: %s", validator); - - bytecode = type(ECDSAKernelFactory).creationCode; - (success, returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(kernelFactory), abi.encode(address(validator)), abi.encode(IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); - require(success, "Failed to deploy ECDSAKernelFactory"); - address ecdsaFactory = address(bytes20(returnData)); - console.log("ECDSAKernelFactory deployed at: %s", ecdsaFactory); + if(EXPECTED_KERNEL_ADDRESS.code.length == 0){ + Kernel kernel = new Kernel{salt:0}(IEntryPoint(ENTRYPOINT_0_6)); + console.log("Kernel address: %s", address(kernel)); + } else { + console.log("Kernel address: %s", address(EXPECTED_KERNEL_ADDRESS)); + } + KernelFactory factory; + if(EXPECTED_KERNEL_FACTORY_ADDRESS.code.length == 0){ + factory = new KernelFactory{salt:0}(DEPLOYER, IEntryPoint(ENTRYPOINT_0_6)); + console.log("KernelFactory address: %s", address(factory)); + } else { + factory = KernelFactory(EXPECTED_KERNEL_FACTORY_ADDRESS); + console.log("KernelFactory address: %s", address(factory)); + } + if(factory.isAllowedImplementation(address(EXPECTED_KERNEL_ADDRESS)) == false) { + console.log("Registering kernel implementation"); + factory.setImplementation(address(EXPECTED_KERNEL_ADDRESS), true); + } + IEntryPoint entryPoint = IEntryPoint(ENTRYPOINT_0_6); + IStakeManager.DepositInfo memory info = entryPoint.getDepositInfo(address(factory)); + if(info.stake == 0) { + console.log("Staking 1 wei to factory"); + factory.addStake{value:1}(1); + } vm.stopBroadcast(); } } diff --git a/scripts/DeploySessionKey.s.sol b/scripts/DeploySessionKey.s.sol index ac521b38..a577b7bf 100644 --- a/scripts/DeploySessionKey.s.sol +++ b/scripts/DeploySessionKey.s.sol @@ -1,24 +1,20 @@ pragma solidity ^0.8.0; -import "src/factory/KernelFactory.sol"; -import "src/validator/ECDSAValidator.sol"; -import "src/factory/ECDSAKernelFactory.sol"; -import "src/executor/ERC721Actions.sol"; -import "src/validator/ERC165SessionKeyValidator.sol"; +import "src/validator/SessionKeyValidator.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; contract DeploySessionKey is Script { - address internal constant DETERMINISTIC_CREATE2_FACTORY = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; + address constant EXPECTED_ADDRESS_SESSION_KEY_VALIDATOR = 0x8e632447954036ee940eB0a6bC5a20A18543C4Fd; function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); - ERC721Actions action = new ERC721Actions(); - - bytes memory bytecode = type(ERC165SessionKeyValidator).creationCode; - (bool success, bytes memory returnData) = DETERMINISTIC_CREATE2_FACTORY.call(abi.encodePacked(bytecode, abi.encode(action))); - require(success, "Failed to deploy ERC165SessionKeyValidator"); - address validator = address(bytes20(returnData)); - console.log("ERC165SessionKeyValidator deployed at: %s", validator); + if(EXPECTED_ADDRESS_SESSION_KEY_VALIDATOR.code.length == 0) { + console.log("deploying SessionKeyValidator"); + ExecuteSessionKeyValidator validator = new ExecuteSessionKeyValidator{salt:0}(); + console.log("validator address: %s", address(validator)); + } else { + console.log("validator address: %s", EXPECTED_ADDRESS_SESSION_KEY_VALIDATOR); + } vm.stopBroadcast(); } } diff --git a/src/Kernel.sol b/src/Kernel.sol index 655b2450..e3b75166 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -2,33 +2,43 @@ pragma solidity ^0.8.0; // Importing external libraries and contracts -import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; +import "solady/utils/EIP712.sol"; +import "solady/utils/ECDSA.sol"; import "account-abstraction/core/Helpers.sol"; -import "account-abstraction/interfaces/IAccount.sol"; import "account-abstraction/interfaces/IEntryPoint.sol"; -import {EntryPoint} from "account-abstraction/core/EntryPoint.sol"; -import "./utils/Exec.sol"; import "./abstract/Compatibility.sol"; import "./abstract/KernelStorage.sol"; import "./utils/KernelHelper.sol"; +import "src/common/Constants.sol"; +import "src/common/Enum.sol"; + /// @title Kernel /// @author taek -/// @notice wallet kernel for minimal wallet functionality -contract Kernel is IAccount, EIP712, Compatibility, KernelStorage { - string public constant name = "Kernel"; +/// @notice wallet kernel for extensible wallet functionality +contract Kernel is EIP712, Compatibility, KernelStorage { + string public constant name = KERNEL_NAME; + + string public constant version = KERNEL_VERSION; - string public constant version = "0.0.2"; + error NotEntryPoint(); + error DisabledMode(); /// @dev Sets up the EIP712 and KernelStorage with the provided entry point - constructor(IEntryPoint _entryPoint) EIP712(name, version) KernelStorage(_entryPoint) {} + constructor(IEntryPoint _entryPoint) KernelStorage(_entryPoint) {} + + function _domainNameAndVersion() internal pure override returns (string memory, string memory) { + return (KERNEL_NAME, KERNEL_VERSION); + } /// @notice Accepts incoming Ether transactions and calls from the EntryPoint contract /// @dev This function will delegate any call to the appropriate executor based on the function signature. fallback() external payable { - require(msg.sender == address(entryPoint), "account: not from entrypoint"); bytes4 sig = msg.sig; address executor = getKernelStorage().execution[sig].executor; + if (msg.sender != address(entryPoint) && !_checkCaller()) { + revert NotAuthorizedCaller(); + } assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), executor, 0, calldatasize(), 0, 0) @@ -45,18 +55,25 @@ contract Kernel is IAccount, EIP712, Compatibility, KernelStorage { /// @param value The amount of Ether to send /// @param data The call data to be sent /// @param operation The type of operation (call or delegatecall) - function execute(address to, uint256 value, bytes calldata data, Operation operation) external { - require(msg.sender == address(entryPoint), "account: not from entrypoint"); - bool success; - bytes memory ret; + function execute(address to, uint256 value, bytes memory data, Operation operation) external payable { + if (msg.sender != address(entryPoint) && !_checkCaller()) { + revert NotAuthorizedCaller(); + } if (operation == Operation.DelegateCall) { - (success, ret) = Exec.delegateCall(to, data); + assembly { + let success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0) + returndatacopy(0, 0, returndatasize()) + switch success + case 0 { revert(0, returndatasize()) } + default { return(0, returndatasize()) } + } } else { - (success, ret) = Exec.call(to, value, data); - } - if (!success) { assembly { - revert(add(ret, 32), mload(ret)) + let success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0) + returndatacopy(0, 0, returndatasize()) + switch success + case 0 { revert(0, returndatasize()) } + default { return(0, returndatasize()) } } } } @@ -67,89 +84,125 @@ contract Kernel is IAccount, EIP712, Compatibility, KernelStorage { /// @param userOpHash The hash of the user operation /// @param missingAccountFunds The funds needed to be reimbursed /// @return validationData The data used for validation - function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) + function validateUserOp(UserOperation memory userOp, bytes32 userOpHash, uint256 missingAccountFunds) external + payable returns (uint256 validationData) { - require(msg.sender == address(entryPoint), "account: not from entryPoint"); + if (msg.sender != address(entryPoint)) { + revert NotEntryPoint(); + } + bytes calldata userOpSignature; + uint256 userOpEndOffset; + bytes32 storage_slot_1; + assembly { + userOpEndOffset := add(calldataload(0x04), 0x24) + userOpSignature.offset := add(calldataload(add(userOpEndOffset, 0x120)), userOpEndOffset) + userOpSignature.length := calldataload(sub(userOpSignature.offset, 0x20)) + storage_slot_1 := sload(KERNEL_STORAGE_SLOT_1) + } // mode based signature - bytes4 mode = bytes4(userOp.signature[0:4]); // mode == 00..00 use validators - require(mode & getKernelStorage().disabledMode == 0x00000000, "kernel: mode disabled"); + bytes4 mode = bytes4(userOpSignature[0:4]); // mode == 00..00 use validators // mode == 0x00000000 use sudo validator // mode == 0x00000001 use given validator // mode == 0x00000002 enable validator - UserOperation memory op = userOp; IKernelValidator validator; - bytes4 sig = bytes4(userOp.callData[0:4]); if (mode == 0x00000000) { // sudo mode (use default validator) - op = userOp; - op.signature = userOp.signature[4:]; - validator = getKernelStorage().defaultValidator; + userOpSignature = userOpSignature[4:]; + assembly { + validator := shr(80, storage_slot_1) + } + } else if (mode & (storage_slot_1 << 224) != 0x00000000) { + revert DisabledMode(); } else if (mode == 0x00000001) { - ExecutionDetail storage detail = getKernelStorage().execution[sig]; + bytes calldata userOpCallData; + assembly { + userOpCallData.offset := add(calldataload(add(userOpEndOffset, 0x40)), userOpEndOffset) + userOpCallData.length := calldataload(sub(userOpCallData.offset, 0x20)) + } + ExecutionDetail storage detail = getKernelStorage().execution[bytes4(userOpCallData[0:4])]; validator = detail.validator; if (address(validator) == address(0)) { - validator = getKernelStorage().defaultValidator; + assembly { + validator := shr(80, storage_slot_1) + } } - op.signature = userOp.signature[4:]; - validationData = (uint256(detail.validAfter) << 160) | (uint256(detail.validUntil) << (48 + 160)); + userOpSignature = userOpSignature[4:]; + validationData = (uint256(detail.validAfter) << 208) | (uint256(detail.validUntil) << 160); } else if (mode == 0x00000002) { + bytes calldata userOpCallData; + assembly { + userOpCallData.offset := add(calldataload(add(userOpEndOffset, 0x40)), userOpEndOffset) + userOpCallData.length := calldataload(sub(userOpCallData.offset, 0x20)) + } // use given validator - // userOp.signature[4:10] = validUntil, - // userOp.signature[10:16] = validAfter, - // userOp.signature[16:36] = validator address, - validator = IKernelValidator(address(bytes20(userOp.signature[16:36]))); - bytes calldata enableData; - bytes calldata remainSig; - (validationData, enableData, remainSig) = _approveValidator(sig, userOp.signature); - validator.enable(enableData); - op.signature = remainSig; + // userOpSignature[4:10] = validAfter, + // userOpSignature[10:16] = validUntil, + // userOpSignature[16:36] = validator address, + (validator, validationData, userOpSignature) = + _approveValidator(bytes4(userOpCallData[0:4]), userOpSignature); } else { return SIG_VALIDATION_FAILED; } - if (missingAccountFunds > 0) { - // we are going to assume signature is valid at this point - (bool success,) = msg.sender.call{value: missingAccountFunds}(""); - (success); + if (missingAccountFunds != 0) { + assembly { + pop(call(gas(), caller(), missingAccountFunds, 0, 0, 0, 0)) + } + //ignore failure (its EntryPoint's job to verify, not account.) } + userOp.signature = userOpSignature; validationData = - _intersectValidationData(validationData, validator.validateUserOp(op, userOpHash, missingAccountFunds)); + _intersectValidationData(validationData, validator.validateUserOp(userOp, userOpHash, missingAccountFunds)); return validationData; } function _approveValidator(bytes4 sig, bytes calldata signature) internal - returns (uint256 validationData, bytes calldata enableData, bytes calldata validationSig) + returns (IKernelValidator validator, uint256 validationData, bytes calldata validationSig) { - uint256 enableDataLength = uint256(bytes32(signature[56:88])); - enableData = signature[88:88 + enableDataLength]; - uint256 enableSignatureLength = uint256(bytes32(signature[88 + enableDataLength:120 + enableDataLength])); - bytes32 enableDigest = _hashTypedDataV4( - keccak256( - abi.encode( - keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), - bytes4(sig), - uint256(bytes32(signature[4:36])), - address(bytes20(signature[36:56])), - keccak256(enableData) + unchecked { + validator = IKernelValidator(address(bytes20(signature[16:36]))); + uint256 cursor = 88; + uint256 length = uint256(bytes32(signature[56:88])); // this is enableDataLength + bytes calldata enableData; + assembly { + enableData.offset := add(signature.offset, cursor) + enableData.length := length + cursor := add(cursor, length) // 88 + enableDataLength + } + length = uint256(bytes32(signature[cursor:cursor + 32])); // this is enableSigLength + assembly { + cursor := add(cursor, 32) + } + bytes32 enableDigest = _hashTypedData( + keccak256( + abi.encode( + VALIDATOR_APPROVED_STRUCT_HASH, + bytes4(sig), + uint256(bytes32(signature[4:36])), + address(bytes20(signature[36:56])), + keccak256(enableData) + ) ) - ) - ); - validationData = _intersectValidationData( - getKernelStorage().defaultValidator.validateSignature( - enableDigest, signature[120 + enableDataLength:120 + enableDataLength + enableSignatureLength] - ), - uint256(bytes32(signature[4:36])) & (uint256(type(uint96).max) << 160) - ); - validationSig = signature[120 + enableDataLength + enableSignatureLength:]; - getKernelStorage().execution[sig] = ExecutionDetail({ - executor: address(bytes20(signature[36:56])), - validator: IKernelValidator(address(bytes20(signature[16:36]))), - validUntil: uint48(bytes6(signature[4:10])), - validAfter: uint48(bytes6(signature[10:16])) - }); - return (validationData, signature[88:88 + enableDataLength], validationSig); + ); + validationData = _intersectValidationData( + getKernelStorage().defaultValidator.validateSignature(enableDigest, signature[cursor:cursor + length]), + uint256(bytes32(signature[4:36])) & 0xffffffffffffffffffffffff0000000000000000000000000000000000000000 + ); + assembly { + cursor := add(cursor, length) + validationSig.offset := add(signature.offset, cursor) + validationSig.length := sub(signature.length, cursor) + } + getKernelStorage().execution[sig] = ExecutionDetail({ + validAfter: uint48(bytes6(signature[4:10])), + validUntil: uint48(bytes6(signature[10:16])), + executor: address(bytes20(signature[36:56])), + validator: IKernelValidator(address(bytes20(signature[16:36]))) + }); + validator.enable(enableData); + } } /// @notice Checks if a signature is valid @@ -172,4 +225,20 @@ contract Kernel is IAccount, EIP712, Compatibility, KernelStorage { return 0x1626ba7e; } + + function _checkCaller() internal view returns (bool) { + if (getKernelStorage().defaultValidator.validCaller(msg.sender, msg.data)) { + return true; + } + bytes4 sig = msg.sig; + ExecutionDetail storage detail = getKernelStorage().execution[sig]; + if ( + address(detail.validator) == address(0) || (detail.validUntil != 0 && detail.validUntil < block.timestamp) + || detail.validAfter > block.timestamp + ) { + return false; + } else { + return detail.validator.validCaller(msg.sender, msg.data); + } + } } diff --git a/src/abstract/KernelStorage.sol b/src/abstract/KernelStorage.sol index 36261ede..8bdc6a2f 100644 --- a/src/abstract/KernelStorage.sol +++ b/src/abstract/KernelStorage.sol @@ -3,32 +3,15 @@ pragma solidity ^0.8.0; // Importing necessary interfaces import "account-abstraction/interfaces/IEntryPoint.sol"; -import "src/validator/IValidator.sol"; - -// Defining a struct for execution details -struct ExecutionDetail { - uint48 validUntil; // Until what time is this execution valid - uint48 validAfter; // After what time is this execution valid - address executor; // Who is the executor of this execution - IKernelValidator validator; // The validator for this execution -} - -// Defining a struct for wallet kernel storage -struct WalletKernelStorage { - bytes32 __deprecated; // A deprecated field - bytes4 disabledMode; // Mode which is currently disabled - uint48 lastDisabledTime; // Last time when a mode was disabled - IKernelValidator defaultValidator; // Default validator for the wallet - mapping(bytes4 => ExecutionDetail) execution; // Mapping of function selectors to execution details -} +import "src/interfaces/IValidator.sol"; +import "src/common/Constants.sol"; +import "src/common/Structs.sol"; /// @title Kernel Storage Contract /// @author taek /// @notice This contract serves as the storage module for the Kernel contract. /// @dev This contract should only be used by the main Kernel contract. contract KernelStorage { - uint256 internal constant SIG_VALIDATION_FAILED = 1; // Signature validation failed error code - IEntryPoint public immutable entryPoint; // The entry point of the contract // Event declarations @@ -36,12 +19,15 @@ contract KernelStorage { event DefaultValidatorChanged(address indexed oldValidator, address indexed newValidator); event ExecutionChanged(bytes4 indexed selector, address indexed executor, address indexed validator); + // Error declarations + error NotAuthorizedCaller(); + error AlreadyInitialized(); + // Modifier to check if the function is called by the entry point, the contract itself or the owner - modifier onlyFromEntryPointOrOwnerOrSelf() { - require( - msg.sender == address(entryPoint) || msg.sender == address(this), - "account: not from entrypoint or owner or self" - ); + modifier onlyFromEntryPointOrSelf() { + if (msg.sender != address(entryPoint) && msg.sender != address(this)) { + revert NotAuthorizedCaller(); + } _; } @@ -53,27 +39,21 @@ contract KernelStorage { } // Function to initialize the wallet kernel - function initialize(IKernelValidator _defaultValidator, bytes calldata _data) external { - WalletKernelStorage storage ws = getKernelStorage(); - require(address(ws.defaultValidator) == address(0), "account: already initialized"); - ws.defaultValidator = _defaultValidator; - emit DefaultValidatorChanged(address(0), address(_defaultValidator)); - _defaultValidator.enable(_data); + function initialize(IKernelValidator _defaultValidator, bytes calldata _data) external payable { + _setInitialData(_defaultValidator, _data); } // Function to get the wallet kernel storage function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) { - bytes32 storagePosition = bytes32(uint256(keccak256("zerodev.kernel")) - 1); assembly { - ws.slot := storagePosition + ws.slot := KERNEL_STORAGE_SLOT } } // Function to upgrade the contract to a new implementation - function upgradeTo(address _newImplementation) external onlyFromEntryPointOrOwnerOrSelf { - bytes32 slot = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + function upgradeTo(address _newImplementation) external payable onlyFromEntryPointOrSelf { assembly { - sstore(slot, _newImplementation) + sstore(IMPLEMENTATION_SLOT, _newImplementation) } emit Upgraded(_newImplementation); } @@ -88,12 +68,16 @@ contract KernelStorage { } // query storage - function getDefaultValidator() public view returns (IKernelValidator) { - return getKernelStorage().defaultValidator; + function getDefaultValidator() public view returns (IKernelValidator validator) { + assembly { + validator := shr(80, sload(KERNEL_STORAGE_SLOT_1)) + } } - function getDisabledMode() public view returns (bytes4) { - return getKernelStorage().disabledMode; + function getDisabledMode() public view returns (bytes4 disabled) { + assembly { + disabled := shl(224, sload(KERNEL_STORAGE_SLOT_1)) + } } function getLastDisabledTime() public view returns (uint48) { @@ -122,7 +106,7 @@ contract KernelStorage { uint48 _validUntil, uint48 _validAfter, bytes calldata _enableData - ) external onlyFromEntryPointOrOwnerOrSelf { + ) external payable onlyFromEntryPointOrSelf { getKernelStorage().execution[_selector] = ExecutionDetail({ executor: _executor, validator: _validator, @@ -135,7 +119,8 @@ contract KernelStorage { function setDefaultValidator(IKernelValidator _defaultValidator, bytes calldata _data) external - onlyFromEntryPointOrOwnerOrSelf + payable + onlyFromEntryPointOrSelf { IKernelValidator oldValidator = getKernelStorage().defaultValidator; getKernelStorage().defaultValidator = _defaultValidator; @@ -146,8 +131,20 @@ contract KernelStorage { /// @notice Updates the disabled mode /// @dev This function can be used to update the disabled mode /// @param _disableFlag The new disabled mode - function disableMode(bytes4 _disableFlag) external onlyFromEntryPointOrOwnerOrSelf { + function disableMode(bytes4 _disableFlag) external payable onlyFromEntryPointOrSelf { getKernelStorage().disabledMode = _disableFlag; getKernelStorage().lastDisabledTime = uint48(block.timestamp); } + + function _setInitialData(IKernelValidator _defaultValidator, bytes calldata _data) internal virtual { + address validator; + assembly { + validator := shr(80, sload(KERNEL_STORAGE_SLOT_1)) + } + if (address(validator) != address(0)) { + revert AlreadyInitialized(); + } + getKernelStorage().defaultValidator = _defaultValidator; + _defaultValidator.enable(_data); + } } diff --git a/src/common/Constants.sol b/src/common/Constants.sol new file mode 100644 index 00000000..ff2382ac --- /dev/null +++ b/src/common/Constants.sol @@ -0,0 +1,16 @@ +pragma solidity ^0.8.0; + +// constants for kernel metadata +string constant KERNEL_NAME="Kernel"; +string constant KERNEL_VERSION="0.2.1"; + +// ERC4337 constants +uint256 constant SIG_VALIDATION_FAILED = 1; + +// STRUCT_HASH +bytes32 constant VALIDATOR_APPROVED_STRUCT_HASH = 0x3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee964176; + +// Storage slots +bytes32 constant KERNEL_STORAGE_SLOT = 0x439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd8; +bytes32 constant KERNEL_STORAGE_SLOT_1 = 0x439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9; +bytes32 constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; diff --git a/src/common/Enum.sol b/src/common/Enum.sol new file mode 100644 index 00000000..4a3668aa --- /dev/null +++ b/src/common/Enum.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.8.0; + +enum Operation { + Call, + DelegateCall +} + +enum ParamCondition { + EQUAL, + GREATER_THAN, + LESS_THAN, + GREATER_THAN_OR_EQUAL, + LESS_THAN_OR_EQUAL, + NOT_EQUAL +} diff --git a/src/common/Structs.sol b/src/common/Structs.sol new file mode 100644 index 00000000..7277bdbd --- /dev/null +++ b/src/common/Structs.sol @@ -0,0 +1,44 @@ +pragma solidity ^0.8.0; + +import "src/interfaces/IValidator.sol"; +import "src/common/Enum.sol"; + +// Defining a struct for execution details +struct ExecutionDetail { + uint48 validAfter; // Until what time is this execution valid + uint48 validUntil; // After what time is this execution valid + address executor; // Who is the executor of this execution + IKernelValidator validator; // The validator for this execution +} + +// Defining a struct for wallet kernel storage +struct WalletKernelStorage { + bytes32 __deprecated; // A deprecated field + bytes4 disabledMode; // Mode which is currently disabled + uint48 lastDisabledTime; // Last time when a mode was disabled + IKernelValidator defaultValidator; // Default validator for the wallet + mapping(bytes4 => ExecutionDetail) execution; // Mapping of function selectors to execution details +} + +// Param Rule for session key +struct ParamRule { + uint256 offset; + ParamCondition condition; + bytes32 param; +} + +struct Permission { + address target; + uint256 valueLimit; + bytes4 sig; + ParamRule[] rules; + Operation operation; +} + +struct SessionData { + bytes32 merkleRoot; + uint48 validAfter; + uint48 validUntil; + address paymaster; // address(0) means accept userOp without paymaster, address(1) means reject userOp with paymaster, other address means accept userOp with paymaster with the address + bool enabled; +} diff --git a/src/executor/KillSwitchAction.sol b/src/executor/KillSwitchAction.sol index 0d8a633d..e18f254c 100644 --- a/src/executor/KillSwitchAction.sol +++ b/src/executor/KillSwitchAction.sol @@ -1,12 +1,12 @@ pragma solidity ^0.8.18; -import "src/validator/IValidator.sol"; +import "src/interfaces/IValidator.sol"; import "src/validator/KillSwitchValidator.sol"; import "src/abstract/KernelStorage.sol"; contract KillSwitchAction { KillSwitchValidator public immutable killSwitchValidator; - + constructor(KillSwitchValidator _killswitchValidator) { killSwitchValidator = _killswitchValidator; } @@ -21,13 +21,14 @@ contract KillSwitchAction { function toggleKillSwitch() external { WalletKernelStorage storage ws = getKernelStorage(); - if(address(ws.defaultValidator) != address(killSwitchValidator)) { + if (address(ws.defaultValidator) != address(killSwitchValidator)) { // this means it is not activated ws.defaultValidator = killSwitchValidator; getKernelStorage().disabledMode = bytes4(0xffffffff); getKernelStorage().lastDisabledTime = uint48(block.timestamp); } else { - (address guardian, IKernelValidator prevValidator, , bytes4 prevDisableMode) = killSwitchValidator.killSwitchValidatorStorage(address(this)); + (, IKernelValidator prevValidator,, bytes4 prevDisableMode) = + killSwitchValidator.killSwitchValidatorStorage(address(this)); // this means it is activated ws.defaultValidator = prevValidator; getKernelStorage().disabledMode = prevDisableMode; diff --git a/src/executor/TokenActions.sol b/src/executor/TokenActions.sol index 37b7bcf2..d494131f 100644 --- a/src/executor/TokenActions.sol +++ b/src/executor/TokenActions.sol @@ -13,7 +13,9 @@ contract TokenActions { IERC721(_token).transferFrom(address(this), _to, _id); } - function transferERC1155Action(address _token, uint256 _id, address _to, uint256 amount, bytes calldata data) external { + function transferERC1155Action(address _token, uint256 _id, address _to, uint256 amount, bytes calldata data) + external + { IERC1155(_token).safeTransferFrom(address(this), _to, _id, amount, data); } } diff --git a/src/factory/AdminLessERC1967Factory.sol b/src/factory/AdminLessERC1967Factory.sol new file mode 100644 index 00000000..d220e8ca --- /dev/null +++ b/src/factory/AdminLessERC1967Factory.sol @@ -0,0 +1,307 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +/// @notice Factory for deploying and managing ERC1967 proxy contracts. +/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ERC1967Factory.sol) +/// @author jtriley-eth (https://github.com/jtriley-eth/minimum-viable-proxy) +/// @author taeklee (https://github.com/zerodevapp/kernel) +contract AdminLessERC1967Factory { + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* CUSTOM ERRORS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev The proxy deployment failed. + error DeploymentFailed(); + + /// @dev The salt does not start with the caller. + error SaltDoesNotStartWithCaller(); + + /// @dev `bytes4(keccak256(bytes("DeploymentFailed()")))`. + uint256 internal constant _DEPLOYMENT_FAILED_ERROR_SELECTOR = 0x30116425; + + /// @dev `bytes4(keccak256(bytes("SaltDoesNotStartWithCaller()")))`. + uint256 internal constant _SALT_DOES_NOT_START_WITH_CALLER_ERROR_SELECTOR = 0x2f634836; + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* EVENTS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev A proxy has been deployed. + event Deployed(address indexed proxy, address indexed implementation); + + /// @dev `keccak256(bytes("Deployed(address,address)"))`. + uint256 internal constant _DEPLOYED_EVENT_SIGNATURE = + 0x09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20; + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* STORAGE */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev The ERC-1967 storage slot for the implementation in the proxy. + /// `uint256(keccak256("eip1967.proxy.implementation")) - 1`. + uint256 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* DEPLOY FUNCTIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Deploys a proxy for `implementation`, + /// and returns its address. + /// The value passed into this function will be forwarded to the proxy. + function deploy(address implementation) internal returns (address proxy) { + proxy = deployAndCall(implementation, _emptyData()); + } + + /// @dev Deploys a proxy for `implementation`, + /// and returns its address. + /// The value passed into this function will be forwarded to the proxy. + /// Then, calls the proxy with abi encoded `data`. + function deployAndCall(address implementation, bytes calldata data) internal returns (address proxy) { + proxy = _deploy(implementation, bytes32(0), false, data); + } + + /// @dev Deploys a proxy for `implementation`, with `salt`, + /// and returns its deterministic address. + /// The value passed into this function will be forwarded to the proxy. + function deployDeterministic(address implementation, bytes32 salt) internal returns (address proxy) { + proxy = deployDeterministicAndCall(implementation, salt, _emptyData()); + } + + /// @dev Deploys a proxy for `implementation`, with `salt`, + /// and returns its deterministic address. + /// The value passed into this function will be forwarded to the proxy. + /// Then, calls the proxy with abi encoded `data`. + function deployDeterministicAndCall(address implementation, bytes32 salt, bytes calldata data) + internal + returns (address proxy) + { + /// @solidity memory-safe-assembly + assembly { + // If the salt does not start with the zero address or the caller. + if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) { + mstore(0x00, _SALT_DOES_NOT_START_WITH_CALLER_ERROR_SELECTOR) + revert(0x1c, 0x04) + } + } + proxy = _deploy(implementation, salt, true, data); + } + + /// @dev Deploys the proxy, with optionality to deploy deterministically with a `salt`. + function _deploy(address implementation, bytes32 salt, bool useSalt, bytes calldata data) + internal + returns (address proxy) + { + bytes memory m = _initCode(); + /// @solidity memory-safe-assembly + assembly { + // Create the proxy. + switch useSalt + case 0 { proxy := create(0, add(m, 0x13), 0x89) } + default { proxy := create2(0, add(m, 0x13), 0x89, salt) } + // Revert if the creation fails. + if iszero(proxy) { + mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) + revert(0x1c, 0x04) + } + + // Set up the calldata to set the implementation of the proxy. + mstore(m, implementation) + mstore(add(m, 0x20), _IMPLEMENTATION_SLOT) + calldatacopy(add(m, 0x40), data.offset, data.length) + // Try setting the implementation on the proxy and revert upon failure. + if iszero(call(gas(), proxy, callvalue(), m, add(0x40, data.length), 0x00, 0x00)) { + // Revert with the `DeploymentFailed` selector if there is no error returndata. + if iszero(returndatasize()) { + mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) + revert(0x1c, 0x04) + } + // Otherwise, bubble up the returned error. + returndatacopy(0x00, 0x00, returndatasize()) + revert(0x00, returndatasize()) + } + + // Emit the {Deployed} event. + log3(0, 0, _DEPLOYED_EVENT_SIGNATURE, proxy, implementation) + } + } + + /// @dev Returns the address of the proxy deployed with `salt`. + function predictDeterministicAddress(bytes32 salt) public view returns (address predicted) { + bytes32 hash = initCodeHash(); + /// @solidity memory-safe-assembly + assembly { + // Compute and store the bytecode hash. + mstore8(0x00, 0xff) // Write the prefix. + mstore(0x35, hash) + mstore(0x01, shl(96, address())) + mstore(0x15, salt) + predicted := keccak256(0x00, 0x55) + // Restore the part of the free memory pointer that has been overwritten. + mstore(0x35, 0) + } + } + + /// @dev Returns the initialization code hash of the proxy. + /// Used for mining vanity addresses with create2crunch. + function initCodeHash() public view returns (bytes32 result) { + bytes memory m = _initCode(); + /// @solidity memory-safe-assembly + assembly { + result := keccak256(add(m, 0x13), 0x89) + } + } + + /// @dev Returns the initialization code of a proxy created via this factory. + function _initCode() internal view returns (bytes memory m) { + /// @solidity memory-safe-assembly + assembly { + /** + * -------------------------------------------------------------------------------------+ + * CREATION (9 bytes) | + * -------------------------------------------------------------------------------------| + * Opcode | Mnemonic | Stack | Memory | + * -------------------------------------------------------------------------------------| + * 60 runSize | PUSH1 runSize | r | | + * 3d | RETURNDATASIZE | 0 r | | + * 81 | DUP2 | r 0 r | | + * 60 offset | PUSH1 offset | o r 0 r | | + * 3d | RETURNDATASIZE | 0 o r 0 r | | + * 39 | CODECOPY | 0 r | [0..runSize): runtime code | + * f3 | RETURN | | [0..runSize): runtime code | + * -------------------------------------------------------------------------------------| + * RUNTIME (127 bytes) | + * -------------------------------------------------------------------------------------| + * Opcode | Mnemonic | Stack | Memory | + * -------------------------------------------------------------------------------------| + * | + * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 3d | RETURNDATASIZE | 0 | | + * 3d | RETURNDATASIZE | 0 0 | | + * | + * ::: check if caller is factory ::::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 33 | CALLER | c 0 0 | | + * 73 factory | PUSH20 factory | f c 0 0 | | + * 14 | EQ | isf 0 0 | | + * 60 0x57 | PUSH1 0x57 | dest isf 0 0 | | + * 57 | JUMPI | 0 0 | | + * | + * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 36 | CALLDATASIZE | cds 0 0 | | + * 3d | RETURNDATASIZE | 0 cds 0 0 | | + * 3d | RETURNDATASIZE | 0 0 cds 0 0 | | + * 37 | CALLDATACOPY | 0 0 | [0..calldatasize): calldata | + * | + * ::: delegatecall to implementation ::::::::::::::::::::::::::::::::::::::::::::::::: | + * 36 | CALLDATASIZE | cds 0 0 | [0..calldatasize): calldata | + * 3d | RETURNDATASIZE | 0 cds 0 0 | [0..calldatasize): calldata | + * 7f slot | PUSH32 slot | s 0 cds 0 0 | [0..calldatasize): calldata | + * 54 | SLOAD | i cds 0 0 | [0..calldatasize): calldata | + * 5a | GAS | g i cds 0 0 | [0..calldatasize): calldata | + * f4 | DELEGATECALL | succ | [0..calldatasize): calldata | + * | + * ::: copy returndata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 3d | RETURNDATASIZE | rds succ | [0..calldatasize): calldata | + * 60 0x00 | PUSH1 0x00 | 0 rds succ | [0..calldatasize): calldata | + * 80 | DUP1 | 0 0 rds succ | [0..calldatasize): calldata | + * 3e | RETURNDATACOPY | succ | [0..returndatasize): returndata | + * | + * ::: branch on delegatecall status :::::::::::::::::::::::::::::::::::::::::::::::::: | + * 60 0x52 | PUSH1 0x52 | dest succ | [0..returndatasize): returndata | + * 57 | JUMPI | | [0..returndatasize): returndata | + * | + * ::: delegatecall failed, revert :::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 3d | RETURNDATASIZE | rds | [0..returndatasize): returndata | + * 60 0x00 | PUSH1 0x00 | 0 rds | [0..returndatasize): returndata | + * fd | REVERT | | [0..returndatasize): returndata | + * | + * ::: delegatecall succeeded, return ::::::::::::::::::::::::::::::::::::::::::::::::: | + * 5b | JUMPDEST | | [0..returndatasize): returndata | + * 3d | RETURNDATASIZE | rds | [0..returndatasize): returndata | + * 60 0x00 | PUSH1 0x00 | 0 rds | [0..returndatasize): returndata | + * f3 | RETURN | | [0..returndatasize): returndata | + * | + * ::: set new implementation (caller is factory) ::::::::::::::::::::::::::::::::::::: | + * 5b | JUMPDEST | 0 0 | | + * 3d | RETURNDATASIZE | 0 0 0 | | + * 35 | CALLDATALOAD | impl 0 0 | | + * 06 0x20 | PUSH1 0x20 | w impl 0 0 | | + * 35 | CALLDATALOAD | slot impl 0 0 | | + * 55 | SSTORE | 0 0 | | + * | + * ::: no extra calldata, return :::::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 60 0x40 | PUSH1 0x40 | 2w 0 0 | | + * 80 | DUP1 | 2w 2w 0 0 | | + * 36 | CALLDATASIZE | cds 2w 2w 0 0 | | + * 11 | GT | gt 2w 0 0 | | + * 15 | ISZERO | lte 2w 0 0 | | + * 60 0x52 | PUSH1 0x52 | dest lte 2w 0 0 | | + * 57 | JUMPI | 2w 0 0 | | + * | + * ::: copy extra calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::: | + * 36 | CALLDATASIZE | cds 2w 0 0 | | + * 03 | SUB | t 0 0 | | + * 80 | DUP1 | t t 0 0 | | + * 60 0x40 | PUSH1 0x40 | 2w t t 0 0 | | + * 3d | RETURNDATASIZE | 0 2w t t 0 0 | | + * 37 | CALLDATACOPY | t 0 0 | [0..t): extra calldata | + * | + * ::: delegatecall to implementation ::::::::::::::::::::::::::::::::::::::::::::::::: | + * 3d | RETURNDATASIZE | 0 t 0 0 | [0..t): extra calldata | + * 3d | RETURNDATASIZE | 0 0 t 0 0 | [0..t): extra calldata | + * 35 | CALLDATALOAD | i t 0 0 | [0..t): extra calldata | + * 5a | GAS | g i t 0 0 | [0..t): extra calldata | + * f4 | DELEGATECALL | succ | [0..t): extra calldata | + * | + * ::: copy returndata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 3d | RETURNDATASIZE | rds succ | [0..t): extra calldata | + * 60 0x00 | PUSH1 0x00 | 0 rds succ | [0..t): extra calldata | + * 80 | DUP1 | 0 0 rds succ | [0..t): extra calldata | + * 3e | RETURNDATACOPY | succ | [0..returndatasize): returndata | + * | + * ::: branch on delegatecall status :::::::::::::::::::::::::::::::::::::::::::::::::: | + * 60 0x52 | PUSH1 0x52 | dest succ | [0..returndatasize): returndata | + * 57 | JUMPI | | [0..returndatasize): returndata | + * | + * ::: delegatecall failed, revert :::::::::::::::::::::::::::::::::::::::::::::::::::: | + * 3d | RETURNDATASIZE | rds | [0..returndatasize): returndata | + * 60 0x00 | PUSH1 0x00 | 0 rds | [0..returndatasize): returndata | + * fd | REVERT | | [0..returndatasize): returndata | + * -------------------------------------------------------------------------------------+ + */ + + m := mload(0x40) + // forgefmt: disable-start + switch shr(112, address()) + case 0 { + // If the factory's address has six or more leading zero bytes. + mstore(add(m, 0x75), 0x604c573d6000fd) // 7 + mstore(add(m, 0x6e), 0x3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e) // 32 + mstore(add(m, 0x4e), 0x3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b) // 32 + mstore(add(m, 0x2e), 0x14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc) // 32 + mstore(add(m, 0x0e), address()) // 14 + mstore(m, 0x60793d8160093d39f33d3d336d) // 9 + 4 + } + default { + mstore(add(m, 0x7b), 0x6052573d6000fd) // 7 + mstore(add(m, 0x74), 0x3d356020355560408036111560525736038060403d373d3d355af43d6000803e) // 32 + mstore(add(m, 0x54), 0x3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b) // 32 + mstore(add(m, 0x34), 0x14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc) // 32 + mstore(add(m, 0x14), address()) // 20 + mstore(m, 0x607f3d8160093d39f33d3d3373) // 9 + 4 + } + // forgefmt: disable-end + } + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* HELPERS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Helper function to return an empty bytes calldata. + function _emptyData() internal pure returns (bytes calldata data) { + /// @solidity memory-safe-assembly + assembly { + data.length := 0 + } + } +} diff --git a/src/factory/ECDSAKernelFactory.sol b/src/factory/ECDSAKernelFactory.sol deleted file mode 100644 index eef57123..00000000 --- a/src/factory/ECDSAKernelFactory.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.18; - -import "./KernelFactory.sol"; -import "src/validator/ECDSAValidator.sol"; - -contract ECDSAKernelFactory { - KernelFactory public immutable singletonFactory; - ECDSAValidator public immutable validator; - IEntryPoint public immutable entryPoint; - - constructor(KernelFactory _singletonFactory, ECDSAValidator _validator, IEntryPoint _entryPoint) { - singletonFactory = _singletonFactory; - validator = _validator; - entryPoint = _entryPoint; - } - - function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) { - bytes memory data = abi.encodePacked(_owner); - proxy = singletonFactory.createAccount(validator, data, _index); - } - - function getAccountAddress(address _owner, uint256 _index) public view returns (address) { - bytes memory data = abi.encodePacked(_owner); - return singletonFactory.getAccountAddress(validator, data, _index); - } -} diff --git a/src/factory/EIP1967Proxy.sol b/src/factory/EIP1967Proxy.sol deleted file mode 100644 index 645ca307..00000000 --- a/src/factory/EIP1967Proxy.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract EIP1967Proxy { - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - constructor(address _logic, bytes memory _data) payable { - require(_logic != address(0), "EIP1967Proxy: implementation is the zero address"); - bytes32 slot = _IMPLEMENTATION_SLOT; - assembly { - sstore(slot, _logic) - } - if (_data.length > 0) { - (bool success,) = _logic.delegatecall(_data); - require(success, "EIP1967Proxy: constructor call failed"); - } - } - - fallback() external payable { - address implementation = _implementation(); - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { revert(0, returndatasize()) } - default { return(0, returndatasize()) } - } - } - - function _implementation() internal view returns (address impl) { - bytes32 slot = _IMPLEMENTATION_SLOT; - assembly { - impl := sload(slot) - } - } -} diff --git a/src/factory/KernelFactory.sol b/src/factory/KernelFactory.sol index 469cc5ee..ba6b5ba4 100644 --- a/src/factory/KernelFactory.sol +++ b/src/factory/KernelFactory.sol @@ -1,68 +1,55 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import "./AdminLessERC1967Factory.sol"; + import "openzeppelin-contracts/contracts/utils/Create2.sol"; -import "./EIP1967Proxy.sol"; import "src/Kernel.sol"; import "src/validator/ECDSAValidator.sol"; +import "solady/auth/Ownable.sol"; -import "./TempKernel.sol"; +contract KernelFactory is AdminLessERC1967Factory, Ownable { + IEntryPoint public entryPoint; + mapping(address => bool) public isAllowedImplementation; -contract KernelFactory { - TempKernel public immutable kernelTemplate; - Kernel public immutable nextTemplate; - IEntryPoint public immutable entryPoint; + constructor(address _owner, IEntryPoint _entryPoint) { + _initializeOwner(_owner); + entryPoint = _entryPoint; + } - event AccountCreated(address indexed account, address indexed validator, bytes data, uint256 index); + function setImplementation(address _implementation, bool _allow) external onlyOwner { + isAllowedImplementation[_implementation] = _allow; + } - constructor(IEntryPoint _entryPoint) { - kernelTemplate = new TempKernel(_entryPoint); - nextTemplate = new Kernel(_entryPoint); + function setEntryPoint(IEntryPoint _entryPoint) external onlyOwner { entryPoint = _entryPoint; } - function createAccount(IKernelValidator _validator, bytes calldata _data, uint256 _index) + function createAccount(address _implementation, bytes calldata _data, uint256 _index) external - returns (EIP1967Proxy proxy) + payable + returns (address proxy) { - bytes32 salt = keccak256(abi.encodePacked(_validator, _data, _index)); - address addr = Create2.computeAddress( - salt, - keccak256( - abi.encodePacked( - type(EIP1967Proxy).creationCode, - abi.encode( - address(kernelTemplate), - abi.encodeCall(TempKernel.initialize, (_validator, address(nextTemplate), _data)) - ) - ) - ) - ); - if (addr.code.length > 0) { - return EIP1967Proxy(payable(addr)); - } - proxy = - new EIP1967Proxy{salt: salt}(address(kernelTemplate), abi.encodeCall(TempKernel.initialize, (_validator, address(nextTemplate), _data))); - emit AccountCreated(address(proxy), address(_validator), _data, _index); + require(isAllowedImplementation[_implementation], "KernelFactory: implementation not allowed"); + bytes32 salt = bytes32(uint256(keccak256(abi.encodePacked(_data, _index))) & type(uint96).max); + proxy = deployDeterministicAndCall(_implementation, salt, _data); } - function getAccountAddress(IKernelValidator _validator, bytes calldata _data, uint256 _index) - public - view - returns (address) - { - bytes32 salt = keccak256(abi.encodePacked(_validator, _data, _index)); - return Create2.computeAddress( - salt, - keccak256( - abi.encodePacked( - type(EIP1967Proxy).creationCode, - abi.encode( - address(kernelTemplate), - abi.encodeCall(TempKernel.initialize, (_validator, address(nextTemplate), _data)) - ) - ) - ) - ); + function getAccountAddress(bytes calldata _data, uint256 _index) public view returns (address) { + bytes32 salt = bytes32(uint256(keccak256(abi.encodePacked(_data, _index))) & type(uint96).max); + return predictDeterministicAddress(salt); + } + + // stake functions + function addStake(uint32 unstakeDelaySec) external payable onlyOwner { + entryPoint.addStake{value: msg.value}(unstakeDelaySec); + } + + function unlockStake() external onlyOwner { + entryPoint.unlockStake(); + } + + function withdrawStake(address payable withdrawAddress) external onlyOwner { + entryPoint.withdrawStake(withdrawAddress); } } diff --git a/src/factory/MultiECDSAKernelFactory.sol b/src/factory/MultiECDSAKernelFactory.sol deleted file mode 100644 index c596b8b2..00000000 --- a/src/factory/MultiECDSAKernelFactory.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.18; - -import "./KernelFactory.sol"; -import "src/validator/MultiECDSAValidator.sol"; -import "src/interfaces/IAddressBook.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -contract MultiECDSAKernelFactory is IAddressBook, Ownable { - KernelFactory public immutable singletonFactory; - MultiECDSAValidator public immutable validator; - IEntryPoint public immutable entryPoint; - - address[] public owners; - - constructor(KernelFactory _singletonFactory, MultiECDSAValidator _validator, IEntryPoint _entryPoint) { - singletonFactory = _singletonFactory; - validator = _validator; - entryPoint = _entryPoint; - } - - function setOwners(address[] calldata _owners) external onlyOwner { - owners = _owners; - } - - function getOwners() external view override returns(address[] memory) { - return owners; - } - - function createAccount(uint256 _index) external returns (EIP1967Proxy proxy) { - bytes memory data = abi.encodePacked(address(this)); - proxy = singletonFactory.createAccount(validator, data, _index); - } - - function getAccountAddress(uint256 _index) public view returns (address) { - bytes memory data = abi.encodePacked(address(this)); - return singletonFactory.getAccountAddress(validator, data, _index); - } - - /** - * add a deposit for this factory, used for paying for transaction fees - */ - function deposit() public payable { - entryPoint.depositTo{value : msg.value}(address(this)); - } - - /** - * withdraw value from the deposit - * @param withdrawAddress target to send to - * @param amount to withdraw - */ - function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner { - entryPoint.withdrawTo(withdrawAddress, amount); - } - /** - * add stake for this factory. - * This method can also carry eth value to add to the current stake. - * @param unstakeDelaySec - the unstake delay for this factory. Can only be increased. - */ - function addStake(uint32 unstakeDelaySec) external payable onlyOwner { - entryPoint.addStake{value : msg.value}(unstakeDelaySec); - } - - /** - * return current factory's deposit on the entryPoint. - */ - function getDeposit() public view returns (uint256) { - return entryPoint.balanceOf(address(this)); - } - - /** - * unlock the stake, in order to withdraw it. - * The factory can't serve requests once unlocked, until it calls addStake again - */ - function unlockStake() external onlyOwner { - entryPoint.unlockStake(); - } - - /** - * withdraw the entire factory's stake. - * stake must be unlocked first (and then wait for the unstakeDelay to be over) - * @param withdrawAddress the address to send withdrawn value. - */ - function withdrawStake(address payable withdrawAddress) external onlyOwner { - entryPoint.withdrawStake(withdrawAddress); - } -} diff --git a/src/factory/TempKernel.sol b/src/factory/TempKernel.sol deleted file mode 100644 index 5c106717..00000000 --- a/src/factory/TempKernel.sol +++ /dev/null @@ -1,250 +0,0 @@ -pragma solidity ^0.8.0; - -import "account-abstraction/interfaces/IEntryPoint.sol"; -import "account-abstraction/interfaces/IAccount.sol"; -import "src/Kernel.sol"; -import "src/abstract/KernelStorage.sol"; - -bytes32 constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - -struct TempStorage { - address newTemplate; - address validator; - bytes data; - bytes validatorData; -} - -using ECDSA for bytes32; - -contract TempKernel is EIP712, IAccount { - string public constant name = "Kernel"; - - string public constant version = "0.0.2"; - - IEntryPoint public immutable entryPoint; - - /// @dev Sets up the EIP712 and KernelStorage with the provided entry point - constructor(IEntryPoint _entryPoint) EIP712(name, version) { - entryPoint = _entryPoint; - } - - // Function to initialize the wallet kernel - function initialize(IKernelValidator _defaultValidator, address _newTemplate, bytes calldata _data) external { - WalletKernelStorage storage ws = getKernelStorage(); - require(address(ws.defaultValidator) == address(0), "account: already initialized"); - ws.defaultValidator = _defaultValidator; - // _defaultValidator.enable(_data); removed to avoid accessing external storage - getStorage().newTemplate = _newTemplate; - getStorage().data = _data; - - (bool success,) = - _callCode(address(_defaultValidator), abi.encodeWithSelector(IKernelValidator.enable.selector, _data)); // to NOT preserve msg.sender - require(success, "account: enable failed with defaultvalidator"); - } - - function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) { - bytes32 storagePosition = bytes32(uint256(keccak256("zerodev.kernel")) - 1); - assembly { - ws.slot := storagePosition - } - } - - function getTempStorage() external view returns (address newTemplate, bytes memory data) { - TempStorage storage strg = getStorage(); - newTemplate = strg.newTemplate; - data = strg.data; - } - - function getStorage() internal view returns (TempStorage storage strg) { - assembly { - strg.slot := address() - } - } - - /// @notice Validates a user operation based on its mode - /// @dev This function will validate user operation and be called by EntryPoint - /// @param userOp The user operation to be validated - /// @param userOpHash The hash of the user operation - /// @param missingAccountFunds The funds needed to be reimbursed - /// @return validationData The data used for validation - function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) - external - returns (uint256 validationData) - { - require(msg.sender == address(entryPoint), "account: not from entryPoint"); - // mode based signature - bytes4 mode = bytes4(userOp.signature[0:4]); // mode == 00..00 use validators - // mode == 0x00000000 use sudo validator - // mode == 0x00000001 use given validator - // mode == 0x00000002 enable validator - UserOperation memory op = userOp; - IKernelValidator validator; - bytes4 sig = bytes4(userOp.callData[0:4]); - if (mode == 0x00000000) { - // sudo mode (use default validator) - op = userOp; - op.signature = userOp.signature[4:]; - validator = getKernelStorage().defaultValidator; - } else if (mode == 0x00000002) { - // no plugin mode - // use given validator - // userOp.signature[4:10] = validUntil, - // userOp.signature[10:16] = validAfter, - // userOp.signature[16:36] = validator address, - validator = IKernelValidator(address(bytes20(userOp.signature[16:36]))); - bytes calldata enableData; - bytes calldata remainSig; - (validationData, enableData, remainSig) = _approveValidator(sig, userOp.signature); - (bool s,) = - _callCode(address(validator), abi.encodeWithSelector(IKernelValidator.enable.selector, enableData)); // callcode for NOT preserving msg.sender - require(s, "account: enable mode enable failed"); - op.signature = remainSig; - } else { - return SIG_VALIDATION_FAILED; - } - if (missingAccountFunds > 0) { - // we are going to assume signature is valid at this point - (bool s,) = msg.sender.call{value: missingAccountFunds}(""); - (s); - } - (, bytes memory ret) = _callCode( - address(validator), - abi.encodeWithSelector(IKernelValidator.validateUserOp.selector, op, userOpHash, missingAccountFunds) - ); - validationData = _intersectValidationData(validationData, abi.decode(ret, (uint256))); - - return validationData; - } - - function _approveValidator(bytes4 sig, bytes calldata signature) - internal - returns (uint256 validationData, bytes calldata enableData, bytes calldata validationSig) - { - uint256 enableDataLength = uint256(bytes32(signature[56:88])); - enableData = signature[88:88 + enableDataLength]; - uint256 enableSignatureLength = uint256(bytes32(signature[88 + enableDataLength:120 + enableDataLength])); - bytes32 enableDigest = _hashTypedDataV4( - keccak256( - abi.encode( - keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), - bytes4(sig), - uint256(bytes32(signature[4:36])), - address(bytes20(signature[36:56])), - keccak256(enableData) - ) - ) - ); - (, bytes memory ret) = _callCode( - address(getKernelStorage().defaultValidator), - ( - abi.encodeWithSelector( - IKernelValidator.validateSignature.selector, - enableDigest, - signature[120 + enableDataLength:120 + enableDataLength + enableSignatureLength] - ) - ) - ); - validationData = _intersectValidationData( - abi.decode(ret, (uint256)), uint256(bytes32(signature[4:36])) & (uint256(type(uint96).max) << 160) - ); - validationSig = signature[120 + enableDataLength + enableSignatureLength:]; - getKernelStorage().execution[sig] = ExecutionDetail({ - executor: address(bytes20(signature[36:56])), - validator: IKernelValidator(address(bytes20(signature[16:36]))), - validUntil: uint48(bytes6(signature[4:10])), - validAfter: uint48(bytes6(signature[10:16])) - }); - getStorage().validator = address(bytes20(signature[16:36])); - getStorage().validatorData = enableData; - return (validationData, signature[88:88 + enableDataLength], validationSig); - } - - receive() external payable {} - - fallback() external payable { - TempStorage storage strg = getStorage(); - address _newImplementation = strg.newTemplate; - bytes32 slot = _IMPLEMENTATION_SLOT; - assembly { - sstore(slot, _newImplementation) - } // update implementation address for used on execution phase - - IKernelValidator defaultValidator = IKernelValidator(getKernelStorage().defaultValidator); - defaultValidator.enable(strg.data); - - IKernelValidator validator = IKernelValidator(getStorage().validator); - if (address(validator) != address(0)) { - validator.enable(getStorage().validatorData); - } - - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), _newImplementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - // WARTNING: this function is NOT VIEW - /// @notice Checks if a signature is valid - /// @dev This function checks if a signature is valid based on the hash of the data signed. - /// @param hash The hash of the data that was signed - /// @param signature The signature to be validated - /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. - function isValidSignature(bytes32 hash, bytes calldata signature) external returns (bytes4) { - (, bytes memory ret) = _callCode( - address(getKernelStorage().defaultValidator), - abi.encodeWithSelector(IKernelValidator.validateSignature.selector, hash, signature) - ); - uint256 validationData = abi.decode(ret, (uint256)); - ValidationData memory data = _parseValidationData(validationData); - if (data.validAfter > block.timestamp) { - return 0xffffffff; - } - if (data.validUntil < block.timestamp) { - return 0xffffffff; - } - if (data.aggregator != address(0)) { - return 0xffffffff; - } - - return 0x1626ba7e; - } - - function _callCode(address _target, bytes memory data) internal returns (bool success, bytes memory ret) { - assembly { - let result := callcode(gas(), _target, 0, add(data, 0x20), mload(data), 0, 0) - // Load free memory location - let ptr := mload(0x40) - // We allocate memory for the return data by setting the free memory location to - // current free memory location + data size + 32 bytes for data size value - mstore(0x40, add(ptr, add(returndatasize(), 0x20))) - // Store the size - mstore(ptr, returndatasize()) - // Store the data - returndatacopy(add(ptr, 0x20), 0, returndatasize()) - // Point the return data to the correct memory location - ret := ptr - success := result - } - if(!success) { - revert(string(ret)); - } - } -} diff --git a/src/interfaces/IAddressBook.sol b/src/interfaces/IAddressBook.sol index 19acad9b..c1f67e99 100644 --- a/src/interfaces/IAddressBook.sol +++ b/src/interfaces/IAddressBook.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.18; interface IAddressBook { - function getOwners() external view returns(address[] memory); + function getOwners() external view returns (address[] memory); } diff --git a/src/IKernel.sol b/src/interfaces/IKernel.sol similarity index 100% rename from src/IKernel.sol rename to src/interfaces/IKernel.sol diff --git a/src/validator/IValidator.sol b/src/interfaces/IValidator.sol similarity index 72% rename from src/validator/IValidator.sol rename to src/interfaces/IValidator.sol index 5644db3b..36081f5a 100644 --- a/src/validator/IValidator.sol +++ b/src/interfaces/IValidator.sol @@ -4,15 +4,18 @@ pragma solidity ^0.8.0; import "account-abstraction/interfaces/UserOperation.sol"; interface IKernelValidator { - function enable(bytes calldata _data) external; + function enable(bytes calldata _data) external payable; - function disable(bytes calldata _data) external; + function disable(bytes calldata _data) external payable; function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds) external + payable returns (uint256); function validateSignature(bytes32 hash, bytes calldata signature) external view returns (uint256); + + function validCaller(address caller, bytes calldata data) external view returns (bool); } // 3 modes diff --git a/src/test/TestERC20.sol b/src/test/TestERC20.sol new file mode 100644 index 00000000..d45c78bd --- /dev/null +++ b/src/test/TestERC20.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "solady/tokens/ERC20.sol"; + +contract TestERC20 is ERC20 { + constructor() ERC20() {} + + function name() public pure override returns (string memory) { + return "TestERC20"; + } + + function symbol() public pure override returns (string memory) { + return "TST"; + } + + function mint(address _to, uint256 _amount) external { + _mint(_to, _amount); + } +} diff --git a/src/test/TestERC721.sol b/src/test/TestERC721.sol index 9733f5c3..7c110fec 100644 --- a/src/test/TestERC721.sol +++ b/src/test/TestERC721.sol @@ -1,15 +1,27 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "openzeppelin-contracts/contracts/token/ERC721/ERC721.sol"; +import "solady/tokens/ERC721.sol"; contract TestERC721 is ERC721 { - constructor() ERC721("TestERC721", "TEST") {} + constructor() ERC721() {} + + function name() public pure override returns (string memory) { + return "TestERC721"; + } + + function symbol() public pure override returns (string memory) { + return "TEST"; + } + + function tokenURI(uint256) public pure override returns (string memory) { + return ""; + } function mint(address _to, uint256 _id) external { _mint(_to, _id); } - + function safeMint(address _to, uint256 _id) external { _safeMint(_to, _id); } diff --git a/src/test/TestKernel.sol b/src/test/TestKernel.sol new file mode 100644 index 00000000..d737a1a3 --- /dev/null +++ b/src/test/TestKernel.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.8.0; + +import "src/Kernel.sol"; + +contract TestKernel is Kernel { + constructor(IEntryPoint _entryPoint) Kernel(_entryPoint) {} + + function sudoInitialize(IKernelValidator _defaultValidator, bytes calldata _data) external payable { + WalletKernelStorage storage ws = getKernelStorage(); + ws.defaultValidator = _defaultValidator; + emit DefaultValidatorChanged(address(0), address(_defaultValidator)); + _defaultValidator.enable(_data); + } +} diff --git a/src/test/TestValidator.sol b/src/test/TestValidator.sol index 95299ef8..1abe161f 100644 --- a/src/test/TestValidator.sol +++ b/src/test/TestValidator.sol @@ -1,27 +1,42 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "src/validator/IValidator.sol"; +import "src/interfaces/IValidator.sol"; contract TestValidator is IKernelValidator { event TestValidateUserOp(bytes32 indexed opHash); event TestEnable(bytes data); event TestDisable(bytes data); + mapping(address kernel => address) public caller; + + function sudoSetCaller(address _kernel, address _caller) external { + caller[_kernel] = _caller; + } + function validateSignature(bytes32, bytes calldata) external pure override returns (uint256) { return 0; } - function validateUserOp(UserOperation calldata, bytes32 userOpHash, uint256) external override returns (uint256) { + function validateUserOp(UserOperation calldata, bytes32 userOpHash, uint256) + external + payable + override + returns (uint256) + { emit TestValidateUserOp(userOpHash); return 0; } - function enable(bytes calldata data) external override { + function enable(bytes calldata data) external payable override { emit TestEnable(data); } - function disable(bytes calldata data) external override { + function disable(bytes calldata data) external payable override { emit TestDisable(data); } + + function validCaller(address _caller, bytes calldata) external view override returns (bool) { + return _caller == caller[msg.sender]; + } } diff --git a/src/utils/Exec.sol b/src/utils/Exec.sol deleted file mode 100644 index 527e0c5f..00000000 --- a/src/utils/Exec.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.7.5 <0.9.0; - -// solhint-disable no-inline-assembly - -enum Operation { - Call, - DelegateCall -} - -/** - * Utility functions helpful when making different kinds of contract calls in Solidity. - */ -library Exec { - function call(address to, uint256 value, bytes memory data) - internal - returns (bool success, bytes memory returnData) - { - assembly { - success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0) - let len := returndatasize() - let ptr := mload(0x40) - mstore(0x40, add(ptr, add(len, 0x20))) - mstore(ptr, len) - returndatacopy(add(ptr, 0x20), 0, len) - returnData := ptr - } - } - - function staticcall(address to, bytes memory data) internal view returns (bool success, bytes memory returnData) { - assembly { - success := staticcall(gas(), to, add(data, 0x20), mload(data), 0, 0) - let len := returndatasize() - let ptr := mload(0x40) - mstore(0x40, add(ptr, add(len, 0x20))) - mstore(ptr, len) - returndatacopy(add(ptr, 0x20), 0, len) - returnData := ptr - } - } - - function delegateCall(address to, bytes memory data) internal returns (bool success, bytes memory returnData) { - assembly { - success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0) - let len := returndatasize() - let ptr := mload(0x40) - mstore(0x40, add(ptr, add(len, 0x20))) - mstore(ptr, len) - returndatacopy(add(ptr, 0x20), 0, len) - returnData := ptr - } - } -} diff --git a/src/utils/KernelHelper.sol b/src/utils/KernelHelper.sol index 70fee93d..5ec7d9d0 100644 --- a/src/utils/KernelHelper.sol +++ b/src/utils/KernelHelper.sol @@ -1,24 +1,26 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -uint256 constant SIG_VALIDATION_FAILED = 1; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; function _intersectValidationData(uint256 a, uint256 b) pure returns (uint256 validationData) { - if (uint160(a) != uint160(b)) { - return SIG_VALIDATION_FAILED; + assembly { + // xor(a,b) == shows only matching bits + // and(xor(a,b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) == filters out the validAfter and validUntil bits + // if the result is not zero, then aggregator part is not matching + switch iszero(and(xor(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff)) + case 1 { + // validAfter + let a_vd := and(0xffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff, a) + let b_vd := and(0xffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff, b) + validationData := xor(a_vd, mul(xor(a_vd, b_vd), gt(b_vd, a_vd))) + // validUntil + a_vd := and(0x000000000000ffffffffffff0000000000000000000000000000000000000000, a) + b_vd := and(0x000000000000ffffffffffff0000000000000000000000000000000000000000, b) + let until := xor(a_vd, mul(xor(a_vd, b_vd), lt(b_vd, a_vd))) + if iszero(until) { until := 0x000000000000ffffffffffff0000000000000000000000000000000000000000 } + validationData := or(validationData, until) + } + default { validationData := SIG_VALIDATION_FAILED } } - uint48 validAfterA = uint48(a >> (160 + 48)); - uint48 validUntilA = uint48(a >> 160); - if(validUntilA == 0) { - validUntilA = type(uint48).max; - } - uint48 validAfterB = uint48(b >> (160 + 48)); - uint48 validUntilB = uint48(b >> 160); - if(validUntilB == 0) { - validUntilB = type(uint48).max; - } - - if (validAfterA < validAfterB) validAfterA = validAfterB; - if (validUntilA > validUntilB) validUntilA = validUntilB; - validationData = uint256(uint160(a)) | (uint256(validUntilA) << 160) | (uint256(validAfterA) << (48 + 160)); } diff --git a/src/validator/ECDSAValidator.sol b/src/validator/ECDSAValidator.sol index dada14e0..ac7385ea 100644 --- a/src/validator/ECDSAValidator.sol +++ b/src/validator/ECDSAValidator.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.0; -import "./IValidator.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; +import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; +import "src/interfaces/IValidator.sol"; struct ECDSAValidatorStorage { address owner; @@ -15,11 +15,11 @@ contract ECDSAValidator is IKernelValidator { mapping(address => ECDSAValidatorStorage) public ecdsaValidatorStorage; - function disable(bytes calldata) external override { + function disable(bytes calldata) external payable override { delete ecdsaValidatorStorage[msg.sender]; } - function enable(bytes calldata _data) external override { + function enable(bytes calldata _data) external payable override { address owner = address(bytes20(_data[0:20])); address oldOwner = ecdsaValidatorStorage[msg.sender].owner; ecdsaValidatorStorage[msg.sender].owner = owner; @@ -28,25 +28,23 @@ contract ECDSAValidator is IKernelValidator { function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external - view + payable override returns (uint256 validationData) { address owner = ecdsaValidatorStorage[_userOp.sender].owner; - if (owner == ECDSA.recover(_userOpHash, _userOp.signature)) { + bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); + if (owner == ECDSA.recover(hash, _userOp.signature)) { return 0; } - - bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); - address recovered = ECDSA.recover(hash, _userOp.signature); - if (owner != recovered) { + if (owner != ECDSA.recover(_userOpHash, _userOp.signature)) { return SIG_VALIDATION_FAILED; } } function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { address owner = ecdsaValidatorStorage[msg.sender].owner; - if( owner == ECDSA.recover(hash, signature) ) { + if (owner == ECDSA.recover(hash, signature)) { return 0; } bytes32 ethHash = ECDSA.toEthSignedMessageHash(hash); @@ -56,4 +54,8 @@ contract ECDSAValidator is IKernelValidator { } return 0; } + + function validCaller(address _caller, bytes calldata) external view override returns (bool) { + return ecdsaValidatorStorage[msg.sender].owner == _caller; + } } diff --git a/src/validator/ERC165SessionKeyValidator.sol b/src/validator/ERC165SessionKeyValidator.sol index d976dfc3..fc487d39 100644 --- a/src/validator/ERC165SessionKeyValidator.sol +++ b/src/validator/ERC165SessionKeyValidator.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "./IValidator.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol"; import "openzeppelin-contracts/contracts/utils/introspection/IERC165.sol"; +import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; +import "src/interfaces/IValidator.sol"; // idea, we can make this merkle root struct ERC165SessionKeyStorage { @@ -19,7 +19,7 @@ struct ERC165SessionKeyStorage { contract ERC165SessionKeyValidator is IKernelValidator { mapping(address sessionKey => mapping(address kernel => ERC165SessionKeyStorage)) public sessionKeys; - function enable(bytes calldata _data) external { + function enable(bytes calldata _data) external payable { address sessionKey = address(bytes20(_data[0:20])); bytes4 interfaceId = bytes4(_data[20:24]); bytes4 selector = bytes4(_data[24:28]); @@ -30,7 +30,7 @@ contract ERC165SessionKeyValidator is IKernelValidator { ERC165SessionKeyStorage(true, selector, interfaceId, validUntil, validAfter, addressOffset); } - function disable(bytes calldata _data) external { + function disable(bytes calldata _data) external payable { address sessionKey = address(bytes20(_data[0:20])); delete sessionKeys[sessionKey][msg.sender]; @@ -42,7 +42,7 @@ contract ERC165SessionKeyValidator is IKernelValidator { function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external - view + payable returns (uint256) { bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); @@ -56,4 +56,8 @@ contract ERC165SessionKeyValidator is IKernelValidator { require(IERC165(token).supportsInterface(sessionKey.interfaceId), "does not support interface"); return (uint256(sessionKey.validAfter) << 160) | (uint256(sessionKey.validUntil) << (48 + 160)); } + + function validCaller(address, bytes calldata) external pure override returns (bool) { + revert("not implemented"); + } } diff --git a/src/validator/KillSwitchValidator.sol b/src/validator/KillSwitchValidator.sol index 81280311..a95c6d6c 100644 --- a/src/validator/KillSwitchValidator.sol +++ b/src/validator/KillSwitchValidator.sol @@ -2,14 +2,12 @@ pragma solidity ^0.8.0; -import "./IValidator.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; +import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; import "account-abstraction/core/Helpers.sol"; import "src/Kernel.sol"; -import { WalletKernelStorage, ExecutionDetail} from "src/abstract/KernelStorage.sol"; -import "./ECDSAValidator.sol"; - +import {WalletKernelStorage, ExecutionDetail} from "src/abstract/KernelStorage.sol"; +import "src/interfaces/IValidator.sol"; struct KillSwitchValidatorStorage { address guardian; @@ -21,20 +19,21 @@ struct KillSwitchValidatorStorage { contract KillSwitchValidator is IKernelValidator { mapping(address => KillSwitchValidatorStorage) public killSwitchValidatorStorage; - function enable(bytes calldata enableData) external override { + function enable(bytes calldata enableData) external payable override { killSwitchValidatorStorage[msg.sender].guardian = address(bytes20(enableData[0:20])); } - function disable(bytes calldata) external override { + function disable(bytes calldata) external payable override { delete killSwitchValidatorStorage[msg.sender]; } function validateSignature(bytes32 hash, bytes calldata signature) external view override returns (uint256) { KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[msg.sender]; - uint256 res = validatorStorage.validator.validateSignature(hash,signature); + uint256 res = validatorStorage.validator.validateSignature(hash, signature); uint48 pausedUntil = validatorStorage.pausedUntil; ValidationData memory validationData = _parseValidationData(res); - if(validationData.aggregator != address(1)) { // if signature verification has not been failed, return with the result + if (validationData.aggregator != address(1)) { + // if signature verification has not been failed, return with the result uint256 delayedData = _packValidationData(false, 0, pausedUntil); return _packValidationData(_intersectTimeRange(res, delayedData)); } @@ -43,13 +42,14 @@ contract KillSwitchValidator is IKernelValidator { function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external + payable override returns (uint256) { - KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[_userOp.sender]; + KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[msg.sender]; // should use msg.sender to prevent others from changing storage uint48 pausedUntil = validatorStorage.pausedUntil; uint256 validationResult = 0; - if(address(validatorStorage.validator) != address(0)){ + if (address(validatorStorage.validator) != address(0)) { // check for validator at first try validatorStorage.validator.validateUserOp(_userOp, _userOpHash, pausedUntil) returns (uint256 res) { validationResult = res; @@ -57,17 +57,18 @@ contract KillSwitchValidator is IKernelValidator { validationResult = SIG_VALIDATION_FAILED; } ValidationData memory validationData = _parseValidationData(validationResult); - if(validationData.aggregator != address(1)) { // if signature verification has not been failed, return with the result + if (validationData.aggregator != address(1)) { + // if signature verification has not been failed, return with the result uint256 delayedData = _packValidationData(false, 0, pausedUntil); return _packValidationData(_intersectTimeRange(validationResult, delayedData)); } } - if(_userOp.signature.length == 71) { + if (_userOp.signature.length == 71) { // save data to this storage validatorStorage.pausedUntil = uint48(bytes6(_userOp.signature[0:6])); validatorStorage.validator = KernelStorage(msg.sender).getDefaultValidator(); validatorStorage.disableMode = KernelStorage(msg.sender).getDisabledMode(); - bytes32 hash = ECDSA.toEthSignedMessageHash(keccak256(bytes.concat(_userOp.signature[0:6],_userOpHash))); + bytes32 hash = ECDSA.toEthSignedMessageHash(keccak256(bytes.concat(_userOp.signature[0:6], _userOpHash))); address recovered = ECDSA.recover(hash, _userOp.signature[6:]); if (validatorStorage.guardian != recovered) { return SIG_VALIDATION_FAILED; @@ -77,4 +78,8 @@ contract KillSwitchValidator is IKernelValidator { return SIG_VALIDATION_FAILED; } } + + function validCaller(address, bytes calldata) external pure override returns (bool) { + revert("not implemented"); + } } diff --git a/src/validator/MultiECDSAValidator.sol b/src/validator/MultiECDSAValidator.sol index 47051150..599e2731 100644 --- a/src/validator/MultiECDSAValidator.sol +++ b/src/validator/MultiECDSAValidator.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.0; -import "./IValidator.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; +import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; import "src/interfaces/IAddressBook.sol"; +import "src/interfaces/IValidator.sol"; contract MultiECDSAValidator is IKernelValidator { event OwnerAdded(address indexed kernel, address indexed owner); @@ -13,7 +13,7 @@ contract MultiECDSAValidator is IKernelValidator { mapping(address owner => mapping(address kernel => bool) hello) public isOwner; - function disable(bytes calldata _data) external override { + function disable(bytes calldata _data) external payable override { address[] memory owners = abi.decode(_data, (address[])); for (uint256 i = 0; i < owners.length; i++) { isOwner[owners[i]][msg.sender] = false; @@ -21,7 +21,7 @@ contract MultiECDSAValidator is IKernelValidator { } } - function enable(bytes calldata _data) external override { + function enable(bytes calldata _data) external payable override { address addressBook = address(bytes20(_data)); address[] memory owners = IAddressBook(addressBook).getOwners(); for (uint256 i = 0; i < owners.length; i++) { @@ -32,7 +32,7 @@ contract MultiECDSAValidator is IKernelValidator { function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external - view + payable override returns (uint256 validationData) { @@ -51,7 +51,7 @@ contract MultiECDSAValidator is IKernelValidator { function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { address signer = ECDSA.recover(hash, signature); - if(isOwner[signer][msg.sender]) { + if (isOwner[signer][msg.sender]) { return 0; } bytes32 ethHash = ECDSA.toEthSignedMessageHash(hash); @@ -61,4 +61,8 @@ contract MultiECDSAValidator is IKernelValidator { } return 0; } + + function validCaller(address _caller, bytes calldata) external view override returns (bool) { + return isOwner[_caller][msg.sender]; + } } diff --git a/src/validator/SessionKeyOwnedValidator.sol b/src/validator/SessionKeyOwnedValidator.sol index 0d30f64b..db1f80f1 100644 --- a/src/validator/SessionKeyOwnedValidator.sol +++ b/src/validator/SessionKeyOwnedValidator.sol @@ -2,10 +2,11 @@ pragma solidity ^0.8.0; -import "./IValidator.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol"; -import "src/utils/KernelHelper.sol"; +import "solady/utils/ECDSA.sol"; +import "solady/utils/EIP712.sol"; import "account-abstraction/core/Helpers.sol"; +import "src/utils/KernelHelper.sol"; +import "src/interfaces/IValidator.sol"; struct SessionKeyStorage { uint48 validUntil; @@ -17,12 +18,12 @@ contract SessionKeyOwnedValidator is IKernelValidator { mapping(address sessionKey => mapping(address kernel => SessionKeyStorage)) public sessionKeyStorage; - function disable(bytes calldata _data) external override { + function disable(bytes calldata _data) external payable override { address sessionKey = address(bytes20(_data[0:20])); delete sessionKeyStorage[sessionKey][msg.sender]; } - function enable(bytes calldata _data) external override { + function enable(bytes calldata _data) external payable override { address sessionKey = address(bytes20(_data[0:20])); uint48 validUntil = uint48(bytes6(_data[20:26])); uint48 validAfter = uint48(bytes6(_data[26:32])); @@ -32,7 +33,7 @@ contract SessionKeyOwnedValidator is IKernelValidator { function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external - view + payable override returns (uint256 validationData) { @@ -40,10 +41,11 @@ contract SessionKeyOwnedValidator is IKernelValidator { address recovered = ECDSA.recover(hash, _userOp.signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (sessionKey.validUntil == 0 ) { // we do not allow validUntil == 0 here + if (sessionKey.validUntil == 0) { + // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } - return _packValidationData(false, sessionKey.validUntil, sessionKey.validAfter); + validationData = _packValidationData(false, sessionKey.validUntil, sessionKey.validAfter); } function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { @@ -51,9 +53,21 @@ contract SessionKeyOwnedValidator is IKernelValidator { address recovered = ECDSA.recover(ethhash, signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (sessionKey.validUntil == 0 ) { // we do not allow validUntil == 0 here + if (sessionKey.validUntil == 0) { + // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } return _packValidationData(false, sessionKey.validUntil, sessionKey.validAfter); } + + function validCaller(address _caller, bytes calldata) external view override returns (bool) { + SessionKeyStorage storage sessionKey = sessionKeyStorage[_caller][msg.sender]; + if (block.timestamp <= sessionKey.validAfter) { + return false; + } + if (block.timestamp > sessionKey.validUntil) { + return false; + } + return true; + } } diff --git a/src/validator/SessionKeyValidator.sol b/src/validator/SessionKeyValidator.sol new file mode 100644 index 00000000..155d4953 --- /dev/null +++ b/src/validator/SessionKeyValidator.sol @@ -0,0 +1,95 @@ +pragma solidity ^0.8.0; + +import "solady/utils/ECDSA.sol"; +import "src/interfaces/IValidator.sol"; +import "account-abstraction/core/Helpers.sol"; +import "solady/utils/MerkleProofLib.sol"; +import "src/common/Enum.sol"; +import "src/common/Structs.sol"; + +contract ExecuteSessionKeyValidator is IKernelValidator { + mapping(address sessionKey => mapping(address kernel => SessionData)) public sessionData; + + function enable(bytes calldata _data) external payable { + address sessionKey = address(bytes20(_data[0:20])); + bytes32 merkleRoot = bytes32(_data[20:52]); + uint48 validAfter = uint48(bytes6(_data[52:58])); + uint48 validUntil = uint48(bytes6(_data[58:64])); + address paymaster = address(bytes20(_data[64:84])); + sessionData[sessionKey][msg.sender] = SessionData(merkleRoot, validAfter, validUntil, paymaster, true); + } + + function disable(bytes calldata _data) external payable { + address sessionKey = address(bytes20(_data[0:20])); + address kernel = msg.sender; + sessionData[sessionKey][kernel].enabled = false; + } + + function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256) + external + payable + returns (uint256) + { + // userOp.signature = signer + signature + permission + merkleProof + address sessionKey = address(bytes20(userOp.signature[0:20])); + bytes calldata signature = userOp.signature[20:85]; + SessionData storage session = sessionData[sessionKey][msg.sender]; + require(session.enabled, "SessionKeyValidator: session key not enabled"); + if (session.merkleRoot == bytes32(0)) { + // sessionKey allowed to execute any tx + return _packValidationData(false, session.validUntil, session.validAfter); + } + if (session.paymaster == address(1)) { + require(userOp.paymasterAndData.length != 0, "SessionKeyValidator: paymaster not set"); + } else if (session.paymaster != address(0)) { + require( + address(bytes20(userOp.paymasterAndData[0:20])) == session.paymaster, + "SessionKeyValidator: paymaster mismatch" + ); + } + + (Permission memory permission, bytes32[] memory merkleProof) = + abi.decode(userOp.signature[85:], (Permission, bytes32[])); + require(permission.target == address(0) || address(bytes20(userOp.callData[16:36])) == permission.target, "SessionKeyValidator: target mismatch"); + require( + uint256(bytes32(userOp.callData[36:68])) <= permission.valueLimit, + "SessionKeyValidator: value limit exceeded" + ); + require( + Operation(uint8(uint256(bytes32(userOp.callData[100:132])))) == permission.operation, + "SessionKeyValidator: operation mismatch" + ); + uint256 dataOffset = uint256(bytes32(userOp.callData[68:100])) + 4; // adding 4 for msg.sig + uint256 dataLength = uint256(bytes32(userOp.callData[dataOffset:dataOffset + 32])); + bytes calldata data = userOp.callData[dataOffset + 32:dataOffset + 32 + dataLength]; + require(bytes4(data[0:4]) == permission.sig, "SessionKeyValidator: sig mismatch"); + for (uint256 i = 0; i < permission.rules.length; i++) { + ParamRule memory rule = permission.rules[i]; + bytes32 param = bytes32(data[4 + rule.offset:4 + rule.offset + 32]); + if (rule.condition == ParamCondition.EQUAL) { + require(param == rule.param, "SessionKeyValidator: param mismatch"); + } else if (rule.condition == ParamCondition.GREATER_THAN) { + require(param > rule.param, "SessionKeyValidator: param mismatch"); + } else if (rule.condition == ParamCondition.LESS_THAN) { + require(param < rule.param, "SessionKeyValidator: param mismatch"); + } else if (rule.condition == ParamCondition.GREATER_THAN_OR_EQUAL) { + require(param >= rule.param, "SessionKeyValidator: param mismatch"); + } else if (rule.condition == ParamCondition.LESS_THAN_OR_EQUAL) { + require(param <= rule.param, "SessionKeyValidator: param mismatch"); + } else if (rule.condition == ParamCondition.NOT_EQUAL) { + require(param != rule.param, "SessionKeyValidator: param mismatch"); + } + } + bool result = MerkleProofLib.verify(merkleProof, session.merkleRoot, keccak256(abi.encode(permission))) + && (sessionKey == ECDSA.recover(ECDSA.toEthSignedMessageHash(userOpHash), signature)); + return _packValidationData(!result, session.validUntil, session.validAfter); + } + + function validCaller(address, bytes calldata) external pure returns (bool) { + revert("SessionKeyValidator: not implemented"); + } + + function validateSignature(bytes32, bytes calldata) external pure returns (uint256) { + revert("SessionKeyValidator: not implemented"); + } +} diff --git a/test/foundry/ERC4337Utils.sol b/test/foundry/ERC4337Utils.sol deleted file mode 100644 index 598b466f..00000000 --- a/test/foundry/ERC4337Utils.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "account-abstraction/core/EntryPoint.sol"; -import "forge-std/Test.sol"; -import "openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol"; - -library ERC4337Utils { - function fillUserOp(EntryPoint _entryPoint, address _sender, bytes memory _data) - internal - view - returns (UserOperation memory op) - { - op.sender = _sender; - op.nonce = _entryPoint.getNonce(_sender, 0); - op.callData = _data; - op.callGasLimit = 10000000; - op.verificationGasLimit = 10000000; - op.preVerificationGas = 50000; - op.maxFeePerGas = 50000; - op.maxPriorityFeePerGas = 1; - } - - function signUserOpHash(EntryPoint _entryPoint, Vm _vm, uint256 _key, UserOperation memory _op) - internal - view - returns (bytes memory signature) - { - bytes32 hash = _entryPoint.getUserOpHash(_op); - (uint8 v, bytes32 r, bytes32 s) = _vm.sign(_key, ECDSA.toEthSignedMessageHash(hash)); - signature = abi.encodePacked(r, s, v); - } -} diff --git a/test/foundry/Kernel.t.sol b/test/foundry/Kernel.t.sol new file mode 100644 index 00000000..0b0f200c --- /dev/null +++ b/test/foundry/Kernel.t.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {EntryPoint} from "account-abstraction/core/EntryPoint.sol"; +import "src/factory/AdminLessERC1967Factory.sol"; +import "src/factory/KernelFactory.sol"; +import "src/Kernel.sol"; +import "src/validator/ECDSAValidator.sol"; +// test artifacts +import "src/test/TestValidator.sol"; +import "src/test/TestERC721.sol"; +import "src/test/TestKernel.sol"; +// test utils +import "forge-std/Test.sol"; +import {ERC4337Utils, KernelTestBase} from "./utils/ERC4337Utils.sol"; + +using ERC4337Utils for EntryPoint; + +contract KernelTest is KernelTestBase { + function setUp() public { + (owner, ownerKey) = makeAddrAndKey("owner"); + (factoryOwner,) = makeAddrAndKey("factoryOwner"); + entryPoint = new EntryPoint(); + kernelImpl = new Kernel(entryPoint); + factory = new KernelFactory(factoryOwner, entryPoint); + vm.startPrank(factoryOwner); + factory.setImplementation(address(kernelImpl), true); + vm.stopPrank(); + + validator = new ECDSAValidator(); + + kernel = Kernel( + payable( + address( + factory.createAccount( + address(kernelImpl), + abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), + 0 + ) + ) + ) + ); + vm.deal(address(kernel), 1e30); + beneficiary = payable(address(makeAddr("beneficiary"))); + } + + function test_initialize_twice() external { + vm.expectRevert(); + kernel.initialize(validator, abi.encodePacked(owner)); + } + + function test_external_call_default() external { + vm.startPrank(owner); + (bool success,) = address(kernel).call(abi.encodePacked("Hello world")); + assertEq(success, true); + } + + function test_validate_signature() external { + Kernel kernel2 = Kernel( + payable( + address( + factory.createAccount( + address(kernelImpl), + abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), + 1 + ) + ) + ) + ); + bytes32 hash = keccak256(abi.encodePacked("hello world")); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, hash); + assertEq(kernel2.isValidSignature(hash, abi.encodePacked(r, s, v)), Kernel.isValidSignature.selector); + } + + function test_validate_userOp() external { + TestKernel kernel2 = new TestKernel(entryPoint); + kernel2.sudoInitialize(validator, abi.encodePacked(owner)); + + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), abi.encodeWithSelector(Kernel.execute.selector, address(0), 0, bytes("")) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + bytes32 hash = entryPoint.getUserOpHash(op); + vm.startPrank(address(entryPoint)); + kernel2.validateUserOp(op, hash, 0); + vm.stopPrank(); + } + + function test_set_default_validator() external { + TestValidator newValidator = new TestValidator(); + bytes memory empty; + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(KernelStorage.setDefaultValidator.selector, address(newValidator), empty) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + assertEq(address(KernelStorage(address(kernel)).getDefaultValidator()), address(newValidator)); + } + + function test_disable_mode() external { + vm.warp(1000); + bytes memory empty; + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + assertEq(uint256(bytes32(KernelStorage(address(kernel)).getDisabledMode())), 1 << 224); + } + + function test_set_execution() external { + console.log("owner", owner); + TestValidator newValidator = new TestValidator(); + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector( + KernelStorage.setExecution.selector, + bytes4(0xdeadbeef), + address(0xdead), + address(newValidator), + uint48(0), + uint48(0), + bytes("") + ) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + ExecutionDetail memory execution = KernelStorage(address(kernel)).getExecution(bytes4(0xdeadbeef)); + assertEq(execution.executor, address(0xdead)); + assertEq(address(execution.validator), address(newValidator)); + assertEq(uint256(execution.validUntil), uint256(0)); + assertEq(uint256(execution.validAfter), uint256(0)); + } + + function test_external_call_execution() external { + console.log("owner", owner); + TestValidator newValidator = new TestValidator(); + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector( + KernelStorage.setExecution.selector, + bytes4(0xdeadbeef), + address(0xdead), + address(newValidator), + uint48(0), + uint48(0), + bytes("") + ) + ); + op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + entryPoint.handleOps(ops, beneficiary); + ExecutionDetail memory execution = KernelStorage(address(kernel)).getExecution(bytes4(0xdeadbeef)); + assertEq(execution.executor, address(0xdead)); + assertEq(address(execution.validator), address(newValidator)); + assertEq(uint256(execution.validUntil), uint256(0)); + assertEq(uint256(execution.validAfter), uint256(0)); + + address randomAddr = makeAddr("random"); + newValidator.sudoSetCaller(address(kernel), randomAddr); + vm.startPrank(randomAddr); + (bool success,) = address(kernel).call(abi.encodePacked(bytes4(0xdeadbeef))); + assertEq(success, true); + vm.stopPrank(); + + address notAllowed = makeAddr("notAllowed"); + vm.startPrank(notAllowed); + (bool success2,) = address(kernel).call(abi.encodePacked(bytes4(0xdeadbeef))); + assertEq(success2, false); + vm.stopPrank(); + } +} diff --git a/test/foundry/Kernel.test.sol b/test/foundry/Kernel.test.sol deleted file mode 100644 index c0fc84c7..00000000 --- a/test/foundry/Kernel.test.sol +++ /dev/null @@ -1,181 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "src/factory/KernelFactory.sol"; -import "src/factory/ECDSAKernelFactory.sol"; -import "src/Kernel.sol"; -import "src/validator/ECDSAValidator.sol"; -import "src/factory/EIP1967Proxy.sol"; -// test artifacts -import "src/test/TestValidator.sol"; -import "src/test/TestERC721.sol"; -// test utils -import "forge-std/Test.sol"; -import {ERC4337Utils} from "./ERC4337Utils.sol"; - -using ERC4337Utils for EntryPoint; - -contract KernelTest is Test { - Kernel kernel; - KernelFactory factory; - ECDSAKernelFactory ecdsaFactory; - EntryPoint entryPoint; - ECDSAValidator validator; - address owner; - uint256 ownerKey; - address payable beneficiary; - - function setUp() public { - (owner, ownerKey) = makeAddrAndKey("owner"); - entryPoint = new EntryPoint(); - factory = new KernelFactory(entryPoint); - - validator = new ECDSAValidator(); - ecdsaFactory = new ECDSAKernelFactory(factory, validator, entryPoint); - - kernel = Kernel(payable(ecdsaFactory.createAccount(owner, 0))); - vm.deal(address(kernel), 1e30); - beneficiary = payable(address(makeAddr("beneficiary"))); - } - - function test_initialize_twice() external { - vm.expectRevert(); - kernel.initialize(validator, abi.encodePacked(owner)); - } - - function test_initialize() public { - Kernel newKernel = Kernel( - payable( - address( - new EIP1967Proxy( - address(factory.nextTemplate()), - abi.encodeWithSelector( - KernelStorage.initialize.selector, - validator, - abi.encodePacked(owner) - ) - ) - ) - ) - ); - ECDSAValidatorStorage memory storage_ = - ECDSAValidatorStorage(validator.ecdsaValidatorStorage(address(newKernel))); - assertEq(storage_.owner, owner); - } - - function test_erc721_receive() external { - Kernel kernel2 = Kernel(payable(address(ecdsaFactory.createAccount(owner, 1)))); - TestERC721 nft = new TestERC721(); - nft.safeMint(address(kernel2), 1); - assertEq(nft.ownerOf(1), address(kernel2)); - } - - function test_validate_signature() external { - Kernel kernel2 = Kernel(payable(address(ecdsaFactory.createAccount(owner, 1)))); - bytes32 hash = keccak256(abi.encodePacked("hello world")); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, hash); - assertEq(kernel2.isValidSignature(hash, abi.encodePacked(r, s, v)), Kernel.isValidSignature.selector); - } - - function test_set_default_validator() external { - TestValidator newValidator = new TestValidator(); - bytes memory empty; - UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(KernelStorage.setDefaultValidator.selector, address(newValidator), empty) - ); - op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); - UserOperation[] memory ops = new UserOperation[](1); - ops[0] = op; - entryPoint.handleOps(ops, beneficiary); - assertEq(address(KernelStorage(address(kernel)).getDefaultValidator()), address(newValidator)); - } - - function test_disable_mode() external { - bytes memory empty; - UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) - ); - op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); - UserOperation[] memory ops = new UserOperation[](1); - ops[0] = op; - entryPoint.handleOps(ops, beneficiary); - assertEq(uint256(bytes32(KernelStorage(address(kernel)).getDisabledMode())), 1 << 224); - } - - function test_set_execution() external { - console.log("owner", owner); - TestValidator newValidator = new TestValidator(); - UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector( - KernelStorage.setExecution.selector, - bytes4(0xdeadbeef), - address(0xdead), - address(newValidator), - uint48(0), - uint48(0), - bytes("") - ) - ); - op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); - UserOperation[] memory ops = new UserOperation[](1); - ops[0] = op; - entryPoint.handleOps(ops, beneficiary); - ExecutionDetail memory execution = KernelStorage(address(kernel)).getExecution(bytes4(0xdeadbeef)); - assertEq(execution.executor, address(0xdead)); - assertEq(address(execution.validator), address(newValidator)); - assertEq(uint256(execution.validUntil), uint256(0)); - assertEq(uint256(execution.validAfter), uint256(0)); - } - - function test_callcode() external { - CallCodeTester t = new CallCodeTester(); - address(t).call{value: 1e18}(""); - Target target = new Target(); - t.callcodeTest(address(target)); - console.log("target balance", address(target).balance); - console.log("t balance", address(t).balance); - console.log("t slot1", t.slot1()); - console.log("t slot2", t.slot2()); - } -} - -contract CallCodeTester { - uint256 public slot1; - uint256 public slot2; - receive() external payable { - } - function callcodeTest(address _target) external { - bool success; - bytes memory ret; - uint256 b = address(this).balance / 1000; - bytes memory data; - assembly { - let result := callcode(gas(), _target, b, add(data, 0x20), mload(data), 0, 0) - // Load free memory location - let ptr := mload(0x40) - // We allocate memory for the return data by setting the free memory location to - // current free memory location + data size + 32 bytes for data size value - mstore(0x40, add(ptr, add(returndatasize(), 0x20))) - // Store the size - mstore(ptr, returndatasize()) - // Store the data - returndatacopy(add(ptr, 0x20), 0, returndatasize()) - // Point the return data to the correct memory location - ret := ptr - success := result - } - require(success, "callcode failed"); - } -} - -contract Target { - uint256 public count; - uint256 public amount; - fallback() external payable { - count++; - amount += msg.value; - } -} diff --git a/test/foundry/KernelExecution.test.sol b/test/foundry/KernelExecution.t.sol similarity index 70% rename from test/foundry/KernelExecution.test.sol rename to test/foundry/KernelExecution.t.sol index 263b052b..990f2c5d 100644 --- a/test/foundry/KernelExecution.test.sol +++ b/test/foundry/KernelExecution.t.sol @@ -1,48 +1,53 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import "src/factory/AdminLessERC1967Factory.sol"; import "src/Kernel.sol"; import "src/validator/ECDSAValidator.sol"; -import "src/factory/EIP1967Proxy.sol"; import "src/factory/KernelFactory.sol"; -import "src/factory/ECDSAKernelFactory.sol"; // test artifacts import "src/test/TestValidator.sol"; import "src/test/TestExecutor.sol"; import "src/test/TestERC721.sol"; // test utils import "forge-std/Test.sol"; -import {ERC4337Utils} from "./ERC4337Utils.sol"; +import "./utils/ERC4337Utils.sol"; // test actions/validators import "src/validator/ERC165SessionKeyValidator.sol"; import "src/executor/TokenActions.sol"; using ERC4337Utils for EntryPoint; -contract KernelExecutionTest is Test { - Kernel kernel; - KernelFactory factory; - ECDSAKernelFactory ecdsaFactory; - EntryPoint entryPoint; - ECDSAValidator validator; - address owner; - uint256 ownerKey; - address payable beneficiary; - +contract KernelExecutionTest is KernelTestBase { function setUp() public { (owner, ownerKey) = makeAddrAndKey("owner"); + (factoryOwner,) = makeAddrAndKey("factoryOwner"); entryPoint = new EntryPoint(); - factory = new KernelFactory(entryPoint); + kernelImpl = new Kernel(entryPoint); + factory = new KernelFactory(factoryOwner, entryPoint); + vm.startPrank(factoryOwner); + factory.setImplementation(address(kernelImpl), true); + vm.stopPrank(); validator = new ECDSAValidator(); - ecdsaFactory = new ECDSAKernelFactory(factory, validator, entryPoint); - kernel = Kernel(payable(address(ecdsaFactory.createAccount(owner, 0)))); + kernel = Kernel( + payable( + address( + factory.createAccount( + address(kernelImpl), + abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), + 0 + ) + ) + ) + ); vm.deal(address(kernel), 1e30); beneficiary = payable(address(makeAddr("beneficiary"))); } function test_revert_when_mode_disabled() external { + vm.warp(1000); bytes memory empty; UserOperation memory op = entryPoint.fillUserOp( address(kernel), @@ -61,9 +66,7 @@ contract KernelExecutionTest is Test { ops[0] = op; vm.expectRevert( - abi.encodeWithSelector( - IEntryPoint.FailedOp.selector, 0, string.concat("AA23 reverted: ", "kernel: mode disabled") - ) + abi.encodeWithSelector(IEntryPoint.FailedOp.selector, 0, string.concat("AA23 reverted (or OOG)")) ); entryPoint.handleOps(ops, beneficiary); } @@ -212,71 +215,4 @@ contract KernelExecutionTest is Test { assertEq(erc721.ownerOf(0), address(0xdead)); } - - function logGas(UserOperation memory op) internal returns (uint256 used) { - try this.consoleGasUsage(op) { - revert("should revert"); - } catch Error(string memory reason) { - used = abi.decode(bytes(reason), (uint256)); - console.log("validation gas usage :", used); - } - } - - function consoleGasUsage(UserOperation memory op) external { - uint256 gas = gasleft(); - vm.startPrank(address(entryPoint)); - kernel.validateUserOp(op, entryPoint.getUserOpHash(op), 0); - vm.stopPrank(); - revert(string(abi.encodePacked(gas - gasleft()))); - } -} - -// computes the hash of a permit -function getStructHash( - bytes4 sig, - uint48 validUntil, - uint48 validAfter, - address validator, - address executor, - bytes memory enableData -) pure returns (bytes32) { - return keccak256( - abi.encode( - keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), - bytes4(sig), - uint256(uint256(uint160(validator)) | (uint256(validAfter) << 160) | (uint256(validUntil) << (48 + 160))), - executor, - keccak256(enableData) - ) - ); -} - -// computes the hash of the fully encoded EIP-712 message for the domain, which can be used to recover the signer -function getTypedDataHash( - address sender, - bytes4 sig, - uint48 validUntil, - uint48 validAfter, - address validator, - address executor, - bytes memory enableData -) view returns (bytes32) { - return keccak256( - abi.encodePacked( - "\x19\x01", - _buildDomainSeparator("Kernel", "0.0.2", sender), - getStructHash(sig, validUntil, validAfter, validator, executor, enableData) - ) - ); -} - -function _buildDomainSeparator(string memory name, string memory version, address verifyingContract) - view - returns (bytes32) -{ - bytes32 hashedName = keccak256(bytes(name)); - bytes32 hashedVersion = keccak256(bytes(version)); - bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); - - return keccak256(abi.encode(typeHash, hashedName, hashedVersion, block.chainid, address(verifyingContract))); } diff --git a/test/foundry/KernelHelper.test.sol b/test/foundry/KernelHelper.t.sol similarity index 56% rename from test/foundry/KernelHelper.test.sol rename to test/foundry/KernelHelper.t.sol index 3294888f..cfa9d12e 100644 --- a/test/foundry/KernelHelper.test.sol +++ b/test/foundry/KernelHelper.t.sol @@ -6,21 +6,29 @@ import "account-abstraction/core/Helpers.sol"; contract KernelHelperTest is Test { function testIntersect(uint48 validAfterA, uint48 validUntilA, uint48 validAfterB, uint48 validUntilB) public { - if(validUntilB == 0) { + if (validUntilB == 0) { validUntilB = 0xffffffffffff; } - if(validUntilA == 0) { + if (validUntilA == 0) { validUntilA = 0xffffffffffff; } uint256 a = _packValidationData(false, validUntilA, validAfterA); uint256 b = _packValidationData(false, validUntilB, validAfterB); - ValidationData memory c = _intersectTimeRange(a, b); + uint256 c = _intersectValidationData(a, b); uint256 expected = _packValidationData( - false, + false, validUntilA < validUntilB ? validUntilA : validUntilB, validAfterA > validAfterB ? validAfterA : validAfterB ); - assertEq(_packValidationData(c), expected); + assertEq(c, expected); + } + + function testIntersectDiff(address a, address b) public { + vm.assume(a != b); + uint256 a_packed = _packValidationData(ValidationData({aggregator: a, validAfter: 0, validUntil: 0})); + uint256 b_packed = _packValidationData(ValidationData({aggregator: b, validAfter: 0, validUntil: 0})); + uint256 c = _intersectValidationData(a_packed, b_packed); + assertEq(c, 1); } } diff --git a/test/foundry/KernelMultiOwned.test.sol b/test/foundry/KernelMultiOwned.test.sol deleted file mode 100644 index c2222aa6..00000000 --- a/test/foundry/KernelMultiOwned.test.sol +++ /dev/null @@ -1,157 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "src/factory/KernelFactory.sol"; -import "src/factory/TempKernel.sol"; -import "src/factory/MultiECDSAKernelFactory.sol"; -import "src/Kernel.sol"; -import "src/validator/MultiECDSAValidator.sol"; -import "src/factory/EIP1967Proxy.sol"; -// test artifacts -import "src/test/TestValidator.sol"; -// test utils -import "forge-std/Test.sol"; -import {ERC4337Utils} from "./ERC4337Utils.sol"; - -using ERC4337Utils for EntryPoint; - -contract KernelTest is Test { - Kernel kernel; - KernelFactory factory; - MultiECDSAKernelFactory ecdsaFactory; - EntryPoint entryPoint; - MultiECDSAValidator validator; - address owner; - uint256 ownerKey; - address payable beneficiary; - - function setUp() public { - (owner, ownerKey) = makeAddrAndKey("owner"); - entryPoint = new EntryPoint(); - factory = new KernelFactory(entryPoint); - - validator = new MultiECDSAValidator(); - ecdsaFactory = new MultiECDSAKernelFactory(factory, validator, entryPoint); - address[] memory owners = new address[](1); - owners[0] = owner; - ecdsaFactory.setOwners(owners); - - kernel = Kernel(payable(ecdsaFactory.createAccount(0))); - vm.deal(address(kernel), 1e30); - beneficiary = payable(address(makeAddr("beneficiary"))); - } - - function test_initialize_twice() external { - vm.expectRevert(); - kernel.initialize(validator, abi.encodePacked(owner)); - } - - function test_validate_signature() external { - Kernel kernel2 = Kernel(payable(address(ecdsaFactory.createAccount(1)))); - bytes32 hash = keccak256(abi.encodePacked("hello world")); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, hash); - assertEq(kernel2.isValidSignature(hash, abi.encodePacked(r, s, v)), Kernel.isValidSignature.selector); - } - - function test_set_default_validator() external { - TestValidator newValidator = new TestValidator(); - bytes memory empty; - UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(KernelStorage.setDefaultValidator.selector, address(newValidator), empty) - ); - op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); - UserOperation[] memory ops = new UserOperation[](1); - ops[0] = op; - entryPoint.handleOps(ops, beneficiary); - assertEq(address(KernelStorage(address(kernel)).getDefaultValidator()), address(newValidator)); - } - - function test_disable_mode() external { - bytes memory empty; - UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) - ); - op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); - UserOperation[] memory ops = new UserOperation[](1); - ops[0] = op; - entryPoint.handleOps(ops, beneficiary); - assertEq(uint256(bytes32(KernelStorage(address(kernel)).getDisabledMode())), 1 << 224); - } - - function test_set_execution() external { - console.log("owner", owner); - TestValidator newValidator = new TestValidator(); - UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector( - KernelStorage.setExecution.selector, - bytes4(0xdeadbeef), - address(0xdead), - address(newValidator), - uint48(0), - uint48(0), - bytes("") - ) - ); - op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); - UserOperation[] memory ops = new UserOperation[](1); - ops[0] = op; - entryPoint.handleOps(ops, beneficiary); - ExecutionDetail memory execution = KernelStorage(address(kernel)).getExecution(bytes4(0xdeadbeef)); - assertEq(execution.executor, address(0xdead)); - assertEq(address(execution.validator), address(newValidator)); - assertEq(uint256(execution.validUntil), uint256(0)); - assertEq(uint256(execution.validAfter), uint256(0)); - } - - function test_callcode() external { - CallCodeTester t = new CallCodeTester(); - address(t).call{value: 1e18}(""); - Target target = new Target(); - t.callcodeTest(address(target)); - console.log("target balance", address(target).balance); - console.log("t balance", address(t).balance); - console.log("t slot1", t.slot1()); - console.log("t slot2", t.slot2()); - } -} - -contract CallCodeTester { - uint256 public slot1; - uint256 public slot2; - receive() external payable { - } - function callcodeTest(address _target) external { - bool success; - bytes memory ret; - uint256 b = address(this).balance / 1000; - bytes memory data; - assembly { - let result := callcode(gas(), _target, b, add(data, 0x20), mload(data), 0, 0) - // Load free memory location - let ptr := mload(0x40) - // We allocate memory for the return data by setting the free memory location to - // current free memory location + data size + 32 bytes for data size value - mstore(0x40, add(ptr, add(returndatasize(), 0x20))) - // Store the size - mstore(ptr, returndatasize()) - // Store the data - returndatacopy(add(ptr, 0x20), 0, returndatasize()) - // Point the return data to the correct memory location - ret := ptr - success := result - } - require(success, "callcode failed"); - } -} - -contract Target { - uint256 public count; - uint256 public amount; - fallback() external payable { - count++; - amount += msg.value; - } -} diff --git a/test/foundry/KillSwitch.t.sol b/test/foundry/KillSwitch.t.sol deleted file mode 100644 index eaf632b1..00000000 --- a/test/foundry/KillSwitch.t.sol +++ /dev/null @@ -1,188 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "src/factory/KernelFactory.sol"; -import "src/factory/TempKernel.sol"; -import "src/validator/ECDSAValidator.sol"; -import "src/factory/ECDSAKernelFactory.sol"; -import "src/Kernel.sol"; -import "src/validator/KillSwitchValidator.sol"; -import "src/executor/KillSwitchAction.sol"; -import "src/factory/EIP1967Proxy.sol"; -// test utils -import "forge-std/Test.sol"; -import {ERC4337Utils} from "./ERC4337Utils.sol"; - -using ERC4337Utils for EntryPoint; - -contract KernelExecutionTest is Test { - Kernel kernel; - KernelFactory factory; - ECDSAKernelFactory ecdsaFactory; - EntryPoint entryPoint; - ECDSAValidator validator; - - KillSwitchValidator killSwitch; - KillSwitchAction action; - address owner; - uint256 ownerKey; - address payable beneficiary; - - function setUp() public { - (owner, ownerKey) = makeAddrAndKey("owner"); - entryPoint = new EntryPoint(); - factory = new KernelFactory(entryPoint); - - validator = new ECDSAValidator(); - ecdsaFactory = new ECDSAKernelFactory(factory, validator, entryPoint); - - kernel = Kernel(payable(address(ecdsaFactory.createAccount(owner, 0)))); - vm.deal(address(kernel), 1e30); - beneficiary = payable(address(makeAddr("beneficiary"))); - killSwitch = new KillSwitchValidator(); - action = new KillSwitchAction(killSwitch); - } - - function test_mode_2() external { - UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(Kernel.execute.selector, owner, 0, "", Operation.Call) - ); - - op.signature = bytes.concat(bytes4(0), entryPoint.signUserOpHash(vm, ownerKey, op)); - UserOperation[] memory ops = new UserOperation[](1); - ops[0] = op; - entryPoint.handleOps(ops, beneficiary); - - - op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(KillSwitchAction.toggleKillSwitch.selector) - ); - address guardianKeyAddr; - uint256 guardianKeyPriv; - (guardianKeyAddr, guardianKeyPriv) = makeAddrAndKey("guardianKey"); - bytes memory enableData = abi.encodePacked( - guardianKeyAddr - ); - { - bytes32 digest = getTypedDataHash( - address(kernel), - KillSwitchAction.toggleKillSwitch.selector, - 0, - 0, - address(killSwitch), - address(action), - enableData - ); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); - - op.signature = abi.encodePacked( - bytes4(0x00000002), - uint48(0), - uint48(0), - address(killSwitch), - address(action), - uint256(enableData.length), - enableData, - uint256(65), - r, - s, - v - ); - } - - uint256 pausedUntil = block.timestamp + 1000; - - bytes32 hash = entryPoint.getUserOpHash(op); - { - (uint8 v, bytes32 r, bytes32 s) = vm.sign(guardianKeyPriv, ECDSA.toEthSignedMessageHash(keccak256(bytes.concat(bytes6(uint48(pausedUntil)),hash)))); - bytes memory sig = abi.encodePacked(r, s, v); - - op.signature = bytes.concat(op.signature, bytes6(uint48(pausedUntil)), sig); - } - - ops[0] = op; - logGas(op); - entryPoint.handleOps(ops, beneficiary); - assertEq(address(kernel.getDefaultValidator()), address(killSwitch)); - op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(Kernel.execute.selector, owner, 0, "", Operation.Call) - ); - - op.signature = bytes.concat(bytes4(0), entryPoint.signUserOpHash(vm, ownerKey, op)); - ops[0] = op; - vm.expectRevert(); - entryPoint.handleOps(ops, beneficiary); // should revert because kill switch is active - vm.warp(pausedUntil + 1); - entryPoint.handleOps(ops, beneficiary); // should not revert because pausedUntil has been passed - } - - function logGas(UserOperation memory op) internal returns (uint256 used) { - try this.consoleGasUsage(op) { - revert("should revert"); - } catch Error(string memory reason) { - used = abi.decode(bytes(reason), (uint256)); - console.log("validation gas usage :", used); - } - } - - function consoleGasUsage(UserOperation memory op) external { - uint256 gas = gasleft(); - vm.startPrank(address(entryPoint)); - kernel.validateUserOp(op, entryPoint.getUserOpHash(op), 0); - vm.stopPrank(); - revert(string(abi.encodePacked(gas - gasleft()))); - } -} - -// computes the hash of a permit -function getStructHash( - bytes4 sig, - uint48 validUntil, - uint48 validAfter, - address validator, - address executor, - bytes memory enableData -) pure returns (bytes32) { - return keccak256( - abi.encode( - keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), - bytes4(sig), - uint256(uint256(uint160(validator)) | (uint256(validAfter) << 160) | (uint256(validUntil) << (48 + 160))), - executor, - keccak256(enableData) - ) - ); -} - -// computes the hash of the fully encoded EIP-712 message for the domain, which can be used to recover the signer -function getTypedDataHash( - address sender, - bytes4 sig, - uint48 validUntil, - uint48 validAfter, - address validator, - address executor, - bytes memory enableData -) view returns (bytes32) { - return keccak256( - abi.encodePacked( - "\x19\x01", - _buildDomainSeparator("Kernel", "0.0.2", sender), - getStructHash(sig, validUntil, validAfter, validator, executor, enableData) - ) - ); -} - -function _buildDomainSeparator(string memory name, string memory version, address verifyingContract) - view - returns (bytes32) -{ - bytes32 hashedName = keccak256(bytes(name)); - bytes32 hashedVersion = keccak256(bytes(version)); - bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); - - return keccak256(abi.encode(typeHash, hashedName, hashedVersion, block.chainid, address(verifyingContract))); -} diff --git a/test/foundry/utils/ERC4337Utils.sol b/test/foundry/utils/ERC4337Utils.sol new file mode 100644 index 00000000..50b6c1af --- /dev/null +++ b/test/foundry/utils/ERC4337Utils.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "account-abstraction/core/EntryPoint.sol"; +import "forge-std/Test.sol"; +import "solady/utils/ECDSA.sol"; +import "src/Kernel.sol"; +import "src/factory/KernelFactory.sol"; +import "src/validator/ECDSAValidator.sol"; + +abstract contract KernelTestBase is Test { + Kernel kernel; + Kernel kernelImpl; + KernelFactory factory; + EntryPoint entryPoint; + ECDSAValidator validator; + address owner; + uint256 ownerKey; + address payable beneficiary; + address factoryOwner; + + function logGas(UserOperation memory op) internal returns (uint256 used) { + try this.consoleGasUsage(op) { + revert("should revert"); + } catch Error(string memory reason) { + used = abi.decode(bytes(reason), (uint256)); + console.log("validation gas usage :", used); + } + } + + function consoleGasUsage(UserOperation memory op) external { + uint256 gas = gasleft(); + vm.startPrank(address(entryPoint)); + kernel.validateUserOp(op, entryPoint.getUserOpHash(op), 0); + vm.stopPrank(); + revert(string(abi.encodePacked(gas - gasleft()))); + } +} + +library ERC4337Utils { + function fillUserOp(EntryPoint _entryPoint, address _sender, bytes memory _data) + internal + view + returns (UserOperation memory op) + { + op.sender = _sender; + op.nonce = _entryPoint.getNonce(_sender, 0); + op.callData = _data; + op.callGasLimit = 10000000; + op.verificationGasLimit = 10000000; + op.preVerificationGas = 50000; + op.maxFeePerGas = 50000; + op.maxPriorityFeePerGas = 1; + } + + function signUserOpHash(EntryPoint _entryPoint, Vm _vm, uint256 _key, UserOperation memory _op) + internal + view + returns (bytes memory signature) + { + bytes32 hash = _entryPoint.getUserOpHash(_op); + (uint8 v, bytes32 r, bytes32 s) = _vm.sign(_key, ECDSA.toEthSignedMessageHash(hash)); + signature = abi.encodePacked(r, s, v); + } +} + +// computes the hash of a permit +function getStructHash( + bytes4 sig, + uint48 validUntil, + uint48 validAfter, + address validator, + address executor, + bytes memory enableData +) pure returns (bytes32) { + return keccak256( + abi.encode( + keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), + bytes4(sig), + uint256(uint256(uint160(validator)) | (uint256(validAfter) << 160) | (uint256(validUntil) << (48 + 160))), + executor, + keccak256(enableData) + ) + ); +} + +// computes the hash of the fully encoded EIP-712 message for the domain, which can be used to recover the signer +function getTypedDataHash( + address sender, + bytes4 sig, + uint48 validUntil, + uint48 validAfter, + address validator, + address executor, + bytes memory enableData +) view returns (bytes32) { + return keccak256( + abi.encodePacked( + "\x19\x01", + _buildDomainSeparator("Kernel", "0.2.1", sender), + getStructHash(sig, validUntil, validAfter, validator, executor, enableData) + ) + ); +} + +function _buildDomainSeparator(string memory name, string memory version, address verifyingContract) + view + returns (bytes32) +{ + bytes32 hashedName = keccak256(bytes(name)); + bytes32 hashedVersion = keccak256(bytes(version)); + bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + + return keccak256(abi.encode(typeHash, hashedName, hashedVersion, block.chainid, address(verifyingContract))); +} diff --git a/test/foundry/validator/SessionKeyValidator.t.sol b/test/foundry/validator/SessionKeyValidator.t.sol new file mode 100644 index 00000000..4503ff37 --- /dev/null +++ b/test/foundry/validator/SessionKeyValidator.t.sol @@ -0,0 +1,400 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "src/factory/AdminLessERC1967Factory.sol"; +import "src/Kernel.sol"; +import "src/validator/ECDSAValidator.sol"; +import "src/factory/KernelFactory.sol"; +// test artifacts +import "src/test/TestValidator.sol"; +import "src/test/TestExecutor.sol"; +import "src/test/TestERC721.sol"; +import "src/test/TestERC20.sol"; +// test utils +import "forge-std/Test.sol"; +import "test/foundry/utils/ERC4337Utils.sol"; +// test actions/validators +import "src/validator/SessionKeyValidator.sol"; + +using ERC4337Utils for EntryPoint; + +contract SessionKeyValidatorTest is KernelTestBase { + ExecuteSessionKeyValidator sessionKeyValidator; + TestERC20 testToken; + address sessionKey; + uint256 sessionKeyPriv; + + function setUp() public { + (owner, ownerKey) = makeAddrAndKey("owner"); + (factoryOwner,) = makeAddrAndKey("factoryOwner"); + (sessionKey, sessionKeyPriv) = makeAddrAndKey("sessionKey"); + entryPoint = new EntryPoint(); + kernelImpl = new Kernel(entryPoint); + factory = new KernelFactory(factoryOwner, entryPoint); + vm.startPrank(factoryOwner); + factory.setImplementation(address(kernelImpl), true); + vm.stopPrank(); + + validator = new ECDSAValidator(); + + kernel = Kernel( + payable( + address( + factory.createAccount( + address(kernelImpl), + abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), + 0 + ) + ) + ) + ); + vm.deal(address(kernel), 1e30); + beneficiary = payable(address(makeAddr("beneficiary"))); + testToken = new TestERC20(); + sessionKeyValidator = new ExecuteSessionKeyValidator(); + } + + function test_mode_2_no_paymaster() external { + testToken.mint(address(kernel), 100e18); + TestERC20 testToken2 = new TestERC20(); + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector( + Kernel.execute.selector, + address(testToken), + 0, + abi.encodeWithSelector(ERC20.transfer.selector, beneficiary, 100), + Operation.Call + ) + ); + + ParamRule[] memory rules = new ParamRule[](1); + rules[0] = ParamRule({ + offset: 32, + condition: ParamCondition.LESS_THAN_OR_EQUAL, + param: bytes32(uint256(1e18)) + }); + + bytes32[] memory data = new bytes32[](2); + data[0] = keccak256( + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken), + sig: ERC20.transfer.selector, + operation: Operation.Call, + rules: rules + }) + ) + ); + + data[1] = keccak256( + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken2), + sig: ERC20.transfer.selector, + operation: Operation.Call, + rules: rules + }) + ) + ); + + bytes32 merkleRoot = _getRoot(data); + bytes memory enableData = abi.encodePacked(sessionKey, merkleRoot, uint48(0), uint48(0), address(0)); + bytes32 digest = getTypedDataHash( + address(kernel), Kernel.execute.selector, 0, 0, address(sessionKeyValidator), address(0), enableData + ); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); + + op.signature = abi.encodePacked( + bytes4(0x00000002), + uint48(0), + uint48(0), + address(sessionKeyValidator), + address(0), + uint256(enableData.length), + enableData, + uint256(65), + r, + s, + v + ); + op.signature = bytes.concat( + op.signature, + abi.encodePacked( + sessionKey, + entryPoint.signUserOpHash(vm, sessionKeyPriv, op), + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken), + sig: ERC20.transfer.selector, + operation: Operation.Call, + rules: rules + }), + _getProof(data, 0) + ) + ) + ); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + logGas(op); + + entryPoint.handleOps(ops, beneficiary); + } + + function test_mode_2_no_paymaster_delegate_call() external { + testToken.mint(address(kernel), 100e18); + TestERC20 testToken2 = new TestERC20(); + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector( + Kernel.execute.selector, + address(testToken), + 0, + abi.encodeWithSelector(ERC20.transfer.selector, beneficiary, 100), + Operation.DelegateCall + ) + ); + + ParamRule[] memory rules = new ParamRule[](1); + rules[0] = ParamRule({ + offset: 32, + condition: ParamCondition.LESS_THAN_OR_EQUAL, + param: bytes32(uint256(1e18)) + }); + + bytes32[] memory data = new bytes32[](2); + data[0] = keccak256( + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken), + sig: ERC20.transfer.selector, + operation: Operation.DelegateCall, + rules: rules + }) + ) + ); + + data[1] = keccak256( + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken2), + sig: ERC20.transfer.selector, + operation: Operation.Call, + rules: rules + }) + ) + ); + + bytes32 merkleRoot = _getRoot(data); + bytes memory enableData = abi.encodePacked(sessionKey, merkleRoot, uint48(0), uint48(0), address(0)); + bytes32 digest = getTypedDataHash( + address(kernel), Kernel.execute.selector, 0, 0, address(sessionKeyValidator), address(0), enableData + ); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); + + op.signature = abi.encodePacked( + bytes4(0x00000002), + uint48(0), + uint48(0), + address(sessionKeyValidator), + address(0), + uint256(enableData.length), + enableData, + uint256(65), + r, + s, + v + ); + op.signature = bytes.concat( + op.signature, + abi.encodePacked( + sessionKey, + entryPoint.signUserOpHash(vm, sessionKeyPriv, op), + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken), + sig: ERC20.transfer.selector, + operation: Operation.DelegateCall, + rules: rules + }), + _getProof(data, 0) + ) + ) + ); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + logGas(op); + + entryPoint.handleOps(ops, beneficiary); + } + + function test_mode_2_no_paymaster_wrong_param() external { + testToken.mint(address(kernel), 100e18); + TestERC20 testToken2 = new TestERC20(); + UserOperation memory op = entryPoint.fillUserOp( + address(kernel), + abi.encodeWithSelector( + Kernel.execute.selector, + address(testToken), + 0, + abi.encodeWithSelector(ERC20.transfer.selector, beneficiary, 100), + Operation.Call + ) + ); + + ParamRule[] memory rules = new ParamRule[](1); + rules[0] = ParamRule({ + offset: 32, + condition: ParamCondition.LESS_THAN_OR_EQUAL, + param: bytes32(uint256(1e18)) + }); + + bytes32[] memory data = new bytes32[](2); + data[0] = keccak256( + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken), + sig: ERC20.transfer.selector, + operation: Operation.Call, + rules: rules + }) + ) + ); + + data[1] = keccak256( + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken2), + sig: ERC20.transfer.selector, + operation: Operation.Call, + rules: rules + }) + ) + ); + + bytes32 merkleRoot = _getRoot(data); + bytes memory enableData = abi.encodePacked(sessionKey, merkleRoot, uint48(0), uint48(0), address(0)); + bytes32 digest = getTypedDataHash( + address(kernel), Kernel.execute.selector, 0, 0, address(sessionKeyValidator), address(0), enableData + ); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); + + op.signature = abi.encodePacked( + bytes4(0x00000002), + uint48(0), + uint48(0), + address(sessionKeyValidator), + address(0), + uint256(enableData.length), + enableData, + uint256(65), + r, + s, + v + ); + op.signature = bytes.concat( + op.signature, + abi.encodePacked( + sessionKey, + entryPoint.signUserOpHash(vm, sessionKeyPriv, op), + abi.encode( + Permission({ + valueLimit: 0, + target: address(testToken), + sig: ERC20.transfer.selector, + operation: Operation.DelegateCall, + rules: rules + }), + _getProof(data, 0) + ) + ) + ); + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + logGas(op); + + vm.expectRevert(); + entryPoint.handleOps(ops, beneficiary); + } +} +// Following code is adapted from https://github.com/dmfxyz/murky/blob/main/src/common/MurkyBase.sol. + +function _getRoot(bytes32[] memory data) pure returns (bytes32) { + require(data.length > 1); + while (data.length > 1) { + data = _hashLevel(data); + } + return data[0]; +} + +function _getProof(bytes32[] memory data, uint256 nodeIndex) pure returns (bytes32[] memory) { + require(data.length > 1); + + bytes32[] memory result = new bytes32[](64); + uint256 pos; + + while (data.length > 1) { + unchecked { + if (nodeIndex & 0x1 == 1) { + result[pos] = data[nodeIndex - 1]; + } else if (nodeIndex + 1 == data.length) { + result[pos] = bytes32(0); + } else { + result[pos] = data[nodeIndex + 1]; + } + ++pos; + nodeIndex /= 2; + } + data = _hashLevel(data); + } + // Resize the length of the array to fit. + /// @solidity memory-safe-assembly + assembly { + mstore(result, pos) + } + + return result; +} + +function _hashLevel(bytes32[] memory data) pure returns (bytes32[] memory) { + bytes32[] memory result; + unchecked { + uint256 length = data.length; + if (length & 0x1 == 1) { + result = new bytes32[](length / 2 + 1); + result[result.length - 1] = _hashPair(data[length - 1], bytes32(0)); + } else { + result = new bytes32[](length / 2); + } + uint256 pos = 0; + for (uint256 i = 0; i < length - 1; i += 2) { + result[pos] = _hashPair(data[i], data[i + 1]); + ++pos; + } + } + return result; +} + +function _hashPair(bytes32 left, bytes32 right) pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + switch lt(left, right) + case 0 { + mstore(0x0, right) + mstore(0x20, left) + } + default { + mstore(0x0, left) + mstore(0x20, right) + } + result := keccak256(0x0, 0x40) + } +} From d5dd4781f8712b857ea586df44b1b77e49786447 Mon Sep 17 00:00:00 2001 From: Derek Chiang Date: Wed, 9 Aug 2023 23:24:21 +0800 Subject: [PATCH 11/33] Add audit report --- audits/kalos_v2_1.pdf | Bin 0 -> 2156854 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/kalos_v2_1.pdf diff --git a/audits/kalos_v2_1.pdf b/audits/kalos_v2_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..73d3266692f00eddc813b6d1929cddebf468db45 GIT binary patch literal 2156854 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%0Aj0D;POV6a3J8WJ}GF)Fo?^$d}?{NEMc<` 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 z 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 S$K3>xxoR0x(J~H+h9QZ^%LRTO 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 z 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�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 l?|H*tGIGA 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

xeHB`3s3wbS!NjqqJn*Rr%!g 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

rlFZ%hBv}XV7|X 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˻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%0DF!7l1QQjw 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%0As(ai*>M{EoV-yBeJy??&#?>pZpmhs9^xg@5 zz><${pxEud2SYFzl7!342vbd}@|-tNHML$;lf&zmEFE4N^x=y`Y{x#aefOj7*Pm^_ zePR3YUE7t)&La_5w^%+|WjwIba%Nlbj~_*L9=D#~>9um1aA+m7AemmAMz1Vj4Xx!( z9U)vY15$vz<#}+U&zA>HKO70@02Y`q+nG??m*KVx5w=T_woBo*i{|UcRLfsvrX=7v zY>-L)FI@J+GEt*o=fufo4F!4+2K`|_qJPq|U(|9qw9p`aRRtqC0WT6@`YK)e)*mkW zftp0dF*$gVl<2M`%GD_P&>@2)fp~T0pn5nIATR@gTri*p7q!3u7Ytg1>*Itzx)=xy zKmx${1wa5K2mlcK7-94gMmITD{FE|wXdWu2%Ms(|!a$J0 z-n$FNflVBw1>>qkfdNL3a8yY6;f8#n?lhxU)dvRKJNjU=SOTGdNPzpkF?bS1Ak~B< zmlQTn3Qf$Esg+b31&8mV23Q=f*HFd@JEwo?6(-=}O@3;YFW8Zpd#A{Dw zwN{Efq(mwK`%iYhpaanl%!8pH&I|;Rf}lC50DyqJ(+6<@PJlakac*d$i2Y3}m!`IA z5*yMph84utrU&Lm_{8{Yg1mImzNW0ukg}BUy29j1E&X4aHSy${d0%ZB{oxyF)0-qF zFRFkA$vhzKhhtC|3~0Y~a=yUygUBS2SoR^4*klriO6EcS7a@}@VnOYNjnKb@7zo zXXiw|@p$~2=TbMnmbLrs{DbcoAKg@bYHQ_}+iNcEth>6a@y4Deh<>y{^aEI6zS>=L zVMp2F^{H<^>ye*ElS?op{NMMQV{jA#Ma1Ih<;nz$EXv6Cl;SBQ7wUXx)rSkxMgCo3 z-2Qt~TnrvkfanzbjBr_NzG_OXYI3b~Xg~Y-EFNC@(aNW99NT;Q>$A2WFWG+DXZz-b z+g~>QbU5z(*1!{M%_rAe&g`&W+8glo9{-aYJ>GasJh7EimCq>6WKxAd{@u zW2v-%P2s8i=Y~Qes-*0kcz#VDD=iAgr1xFgcP;zBFe-&=HF3*}*af*nwF-mBKkUcU zxBevymV)5%7!nCfqvO~-JYP%@$q4Q$l3W8!F$yn|N=H(A+lOo)4;`uiadyG@00oGb z!9I`+#s~&3!0qaPfyWF601(Ip<7Xcr0-^fBMwlSFF@z3_Kun=%2&xPH0NleIg$ztT z0-_k!Xov6vnphZpFyWm5)CJ?vfq*E~I7bqQiybBu9@GmH3QrP*K9b-XTn1u(Ndo`` z(2q1$XgWv&3Cm!HK{}AIOf~=@Ih^Qxeq6D8TCE~?kh*Y$XX!Za%BgpXOaML0d3VmDZ$4sZ*xbYYT__S5J)?^VLH+wijwR;WaZ~+nUAaNgP9!OU;47|`{7x+{hr55)k0_obvpfm>ggw95o zZl)NtLf7#jy-PtHPt3IxhD0I?#bOGT3ZMAdw-h>Ct~F;?j7To7H3o)oxLiCD-&5~_ zbs0oc(NkC9aua&*?%yPwYcZ|^eZWc#e0K{>H(yN8_qs9=r!Wv)R}#pbDUO4IxVimV z7YvSwRqAB^;U7J;XpMnWK_EIo0{N(JJtI$X(EN!Da3a=z4Gw?iZk`Sd0ZU?%)mG2As^qMZ#qsr- z)~qm}cz^F0gI}^Guply`CL^M;D1LNZ@zc{Lp91t_!ijfMr!;7yEi@4a50&0xApnA< zxr#ub@)w*70D=53zygEN4-yv!AW->>2&8|IB|Nf>N0IZP{udEdBc^&u>E0mz6!>3E zI!=%;H_XhB2@8rClB+VI~MZ4JQls;sl*Rn%-Hs3PWzg| zLm!l$*gW9OwyN{nYp?FAzrMTa+r7;{>}~m>9nAN8o3HO_xU#G2^w!jOp4C+p($!Kd z`R||~5cgmxh3?_Ls>A@X)r-Pq;79~l&~az)C9aRsr>l6&whJ+-|yEh*?u}_`*FMN+Kk(um;87z=Imz6q4&(6Z4SKN z9{l4$%jKOuyWdtmJ)K)$%q&W!7pF06i#WsUcvFUno|q+FzD&7(x#x!)^=I0Bu77O& z4FHfJ+ZUm>FT-r-BWxGLJI)7vchc}loAQ|@%#;MYSp2W3J;jiTB#oSv9wlrkWu-*m zMg0HlPf;(+{_BcNCV6?X3$l3?B^0BfuhOM&{h5V|N4c->UsLoNnVAcJhBEUl55o&O`4oR`m*uXmPK*XR~No~y!`F+O>4g% zv;EejJ-4T{cTC&gF?CPupZa6~dVmG5I9ee1um9y;In!-2hNSS*pj zmRceP1cc{FBuXxaL%`$i3?lCK2_506E-wTs{D2_|64P;iE|^|TG4KgKTu6gKJTFdz z!C^4qGSCsk+WSBsh<<7unu!X;FmyJDOClntH+Vde#dVL)7?58xDlwm_Kj=J$ zf21iQC0rmC;fX}>(}Kkkh$JeLV@il0{NmG-*Z!}5$#i2(Fpcx?3H`W>S_3u&b%{6b zDf;7&1_KY&4)Zq&KL}V135Ox$ftcYASr&K-!QDp@*+0Hy@__h;3`=gfKEddhVz%T2 zg$;;}tj>sPEQ%UjQT)vG2}f2hy}4t;$rbsFM|dR!QTQwbbhxNK9Q1>Pb8)^n`d`S1 z0tA+SaH(WI9YlW!*Z_cl>{Ez-001JSs>M`|1d)IEda(Sx*cNY2h=Cs+AV>%mrN>C~ zQsreis_GKWpjvN8{$W`(Dfrphk*_a_Tm4+>=GU`#y_0`%ZOO4s{Xg4Ud2UXpdw4sobUV2 z^s-Bvm;d(Vsm>q1wf*vi?dBTWl`);4CEeH+eDqz*p?6J3H(1W^4fy`!fN%C|-+fjz zwvp8@ot_;_FG^-q=dp&>@TLwEE}kZR<0-|4|EczG^!nm}&ku)B(w6*#p*rKn%oTfq@38 zfYJHE38;wwMGpx-d`vVS06=I4r|~mW{p?!{&Cd$P7zpTxe{fd}h_eL-F~8U+l4gyt z4-x|c07x{$5<|DdFf6es{pf){;362P3x*Nwgh7Jh89|T*25^sffIfnu=|UfH0%{U! zdw~H+3NtK)6_&~hLlq#X{Db8@;czl42uEdyXLFH9m!?d}}0y|a1K?ebOM6u*8cbJ^!f3l7K5IuJ2scksCFk#mkk&p947 z^N^|TMRj5;$1{Y&mEkFHD#*Wpf%mPx^;g!NXv0G%9$2X5gGeM32yoyemPBTH8WMt| z`YBbuV!nt(B-}xF(Urx~yB7wvsJN&oy5dOh)DhE_k9z;~!^O#h>O7nRQIP-;_(3C5 z5Z70umu0`veu*!aDa2wa9u~FQFJVa(PruN_qUN0H;d+yWC*Tu^L>vwe&7E;ZcOKG{ zg!HByfxIS8-!Nx8jH?>Nd2lY8knUgv-*vm|yPN}2ySy-HD{i-U;heoNsA%L~15xp0 z99P2e3-&XGTiw+%5`_ejDf{mPGFK{3s;O#OwrIlY*NR59>Vl1ACi&rGjlar393l`T zU>2?(h6e>B&=CHZd-SdY`Ln5;_Umq_QwHD;Fho3%k=*sO;VA^JoFAMQo-r&xp)tch zBgB*$6p$AZUKSl)lN{fi6VqH2KeDD^$;1)+-kA6Grm3e_)x15&kQ2jFittQIcj)2V z|3bIFmx5zZaIW;jzJ>Z<$Rs!c752Xfn5g`NOO|rUaz0rppeThD4>3(ErR(Gj9~IN! z!8Unu1AVz+{`_dGC@Dgm886LGSCkj1>-&2Su7%@I1D8$-eQ{p&TTdju|3dnfH*)u` zEc*EU{wFq7e6h9mLR;h29W6I@5Bz@5pda@Pyt!}SkNXDRY;XOpz47v{(*3K0Ck^HM z``91$pL_kWWIRL87x-%wF($Fulfq}>Nd(Y|egB~2j%?d;e8hBF4J?)vB?F6;ld7$&=MFfw`pKKeKel~y(RS-I+Yj$_ zULODJ$>JOB5udHM99d^My)EGSKFgJMHcSUMzd>Rn^|Lo+o$dzxv4d%W+G`XF;|v!q5zm@Z0CCmyc@K{f}Q;L9v?g9L~dj zd3ss)>w1z}27E5nd92hZf{2SD^qr!2E&J~|qRgF{7%Ob7p@#;8AeTPw(YOA_1#6@2 z2W?miLS^6>Y&=(p7s-jRBS!57F%TcJMo-qjTWCD((_I8Yg+(A>x^hryK4zMI3jq+i z6a4^PF!1=>CkUEgDlo#p6ADeZedsU-0rUgTL5)Ty#)WPq1q2f z^$`@u2#Rwl#)WktNEt31h?>;Z0t2HDI0Q8;6^;R6q6`Gh07++sLrEZ^Xe3BDAR&+= zCYu|TD~K-y0 z)~jfwxp98fq&HI@+nD#_M-8jbkKXp(m>oB#?CY3ypkvnlj_Lb4Chhrs?9SUmx8830 z;Fs!E-xa-bA${4Yv}I>f9zUJ5^jyrW!@;9A7;9hf9kA55-vZC{kz#8$!(C5e2>LKc z-+ENnopce7Kj}YA`hmp}@I>UI9(0(Hg>t`uutJ?rxJ2YmrO==g@H=LZ-r*L-H4Zhrmvu;gr|Mnj{~@i+oXKk#?OAiXdS^u}HaXS?0SRSg2e5H}Qw^mYx7?@b3n zaLEa|Lp`orcL0J%cnc2M!q5ZT{o&nnFAR~27fAW$NQ=&_XK+|>-7N->C(#*de^XLT z<@lAak9hgX^u}_zUJXJ&9y-wY8_@hd3C~jtLkl9(2j@mtr&#jB%{jpl17f3V6BAm}k_YF- z4Ju6-UX#CM!q~$r=6$ts=7sl5pP%HL9nDgSaSU?z$kUz!L?CGUEei~RMJ2E)@DMo^ z$p1ov0ze@7hnP)v=aFT6062L?M^zt>mSJ$y$rlGn$l> z>SUt_NCp?Hr`CtJEgO4v&(_;lF4}H=W&7zP+qbWFUKn!wWYU=}AtyJOk8d!a+HSqN zFX*R_{XgBHetEuVd^58+jggl?0}7Br*05U6l%ayhr%B#eDqHuux_!O&Y`gxOkNtmz zEih+8ZRa9v7b7|^h5mNd|I3fnFE8Vk7Zc<%42As9xpu}72zVinkrXayEM{lN5tZ(4 z_`Y*;r-gCDaXIv`V17+GJ1+w-6#OgfOMUC#x)4t|){Q{Kkg32C!{XsZQj*kzq|iYY z7$@`r4^V*kkhQ*KFF*TG!1&vTs&fJ$dNa_0z~}>_A9Ozp9RLvEf1$$T4-Ft8K~$4{ zoB;@M!9dBV5l|~`6jFn0g|`s>u)r3WI4}_RU^vhRv;$2%G;z!zpay|<;*o&?NHAoC zK^TaAl9&knfF=wcAO&H90U{8`z+oU=6K3DSUYJZaXotz-L}YWK^LTMZ!o)I3YLz^v zSyMbhUp~oLH_zO($lSEVRKLJjJ;zW!)iY;^CTpNaMw2qR+9RvgxBujzAsd%%4qH>whM)HmFK!acf<6?RsK)} z@&~Uu@*Es&1b4R>5c?1a1gTQ#>8T^Yd8Zf*g~8VPhvig_E^3|-5E;wia}nHuN5}Ez zJ&+JYKY_>o5&Cf475X2n2XST~y`l#6MqDo)F&IZIs>2a;7aa)NhwGGydN0*5ccLFe zKtGh;N@KW5?dwTr(Xr4^1QhzgRr>jrj2k`SomYoGw>YtX9!J8#{|gFVoL=*Lu(TkQ z1125-gTOy2SXVVjFBs%b?ijcGq9688OU4sfG^&72V$lgSGL8&|rrwWSgehhl;!K&t z3KAMKgNmY~1|-Heq@=W@XN}0o99f(+tSokTRl!qJhVOfQ&b5s*F1%m;_T0eoG^&J) zgK|IaI1DramEmfEfdL4_K%fF#3JK5;I$6Mg`d`>&F_$dmk>z}fLPSxDXle<~6UaZ9 zK1!ya2ixq$3G(5F1NnzAC0v{x=U$Yi7?7`S=&v18=RI+tan6{4C#QtGG&kz4ClcO! zA${xeoc2|q{N?1P$}?N*F19s&y|ek-J*_wQ4!YG2=!bo7?Hl+*d(~%~5}ujEH|eot z!o9zGWFCX7SE%Bx$`}(vA;8f{aANI)MjuEJw9`=+0VH z943YU;e9Nyz>t+aWtp#6N0&$ow-zkX`zI0XR^5C9TsyA;-W-g@(t`lTmXxoJd|{2vjL zX+OBSi|EmT{DvYf)D^=4ueZ!U<(Xz!Pv)wxL^?U0VWO%L_c8pM{no@ znjm!BeG8^u?zV z=Y1MG{iCqaTdmD+1q@mhICzC`zqyjY9H!ilNax#63LoXaO7yM&%=+_C;{TC~I36vL zNSCRt!7=3qVUva6{PF& zJN`o-G+LgEb+*R127_R+3WBVtL zsm-20s&38FnHSeBxUpr#zE>hziv+%ENc%zTCG?|Z=fBx8jWivuwnjii4lZoqIOmBNLci)=gPd+IBbaU0&ZMBzoG+y7; z{QaJRx7r8&yl?O?`v?EJfACNHTW;*hT=TRdIg%{o+=IylM-{PEac0lVQ1@VO5|{3V zLMJ%l;}2-;UqT<~aSwwYQZb0d5INZX%NK#mWCr<2YqO=*nRKHTN2hjIR@jd)Od2D= zTUe5)npCZx)2y6YCmB>EZYlI!JS1k*Q!iflXy@&#H*7zDWBd7-?fX}4m+F5!oN#ul z_1HSo;SVfl+XAm24E*kp@zaf-E0^(`%4n&PFRvf*5CZo9@YfKYw{&?YY^Cj;* zr`)kdb8Lt1(m}(I$IZWk78oc41OSi-+r@wz$Gq3SDI8u;@_3jnA@;*JUdUypMDXhh z*tu~;xfnwvJgf)v&s;brgJv=cTk3cv`DC5vzox9GZ#|L=)EeS21Ok>s0gf1+h#-;? zWojS=@r1dDFG4@G28ySFqV)sgW$Y4x=uA{^GZ?)EvcOoVzE+wcfMy7U00=ZN^zaLU zc3=PkMS_@u>HeS}vlJM8n=!H&86 zJEpgHjM?$~kPY8Azw=ei@+&1TT*z8-B4Or%4nJ2do4|Gcx6wLM^p;^ zl9+NMjzsIzf%L6^@48>a(Jh0*>3YAH_x>$ozaA&x2(b18hqGVQdziyZ!lMdALMfBM z?CtAzBOcD^qgNkFH{VLPPv!Jvp)>D$03gVxy`P#G=c@#4S2YaA4GmnyxOBvHkrwbC zB9Z8=)5{e~B8dclPpNc{#t@R++{4Ej4+wqqOa*ax zVenX2D-{-M(RB_`#bECleZYyDWImhbE})BfL^d5qA@<%8bIXdsh}7T3dE}Q^gl;)fcwce+{xv2i|HQ{PVuSzwI0H+kX2rf4?{Fou!)m6g-RC z_4;({*|ER=ObTdn3DN6vB1L8mS-^Bjsm1kv%(@2{avw*1l<}gsJR0c3ex}HvF#~BlSH{PoN! z+s*H6zg)Kcw8?gD#;>0jU26|HzRq-TjsGVbEa!Fy-1yLXrQK)KOOgrAjKXAcYyc%W zjFuBeE6-vL8o-{|%3Cl&^zstvd#@^Yz3=(iZvEFE8Gi;LsIUSAPC$+5yb$oiap{C1 zWStg#6CTFGG3m5W6Tdc(SDs1MsW2qsLwOkg+(p2Xy)?X{9AQ&6)no)VrM}g-{vius z5Ri|GqcI3P5z$>vQfNRFDk}e=fPv8m>VL6sf&2rZA2e?ZRc{|F%_o576G-z7q#1$` z5ePsZ!6^NJv>zZ1HHhvXOz+`>fdf(LrbxO8xL^SN01PAs3~Yh1#4@dMOlv#>K&p`0$OVH;STc$}VDn2dGdvl2GaS7U;0_1<=!QP*lMMg}#6Z}QIh@E` zUUa@Vxk8cMtSK0#Eg9ugKE+r)$6WWArQxx_rpE(Y9``Gs=36q}Gi#7MzFZzZK$TLX z%O7TKn3pttP1SRIhpaj?vF)eDA9gPM5MYq`2Rr8N@0h!t+ zD6SO9&6R=lSQtkwm|M?Cko(0TSl6e6L6TUJBoOFXL0`#!*-j=?bb4PdkB59)aRequ z9Gcv(sAXz$zj}p61FBx|Xfi1n9I69xk%GYV15$tx5J2LjqJV`I-31-^E<4QKnqp8R zOm{DgGX}x;*2&@;k=knoOmDHMZfGwIto^_`m%?E2-5)0UvUEo=I1-jEVEP6ce1Z%D zsSrGF`y~vXKw>bZ-ujG|#wqW=HQ}9?@<-OI3>qBi4jniDsJUOU2ci3$-NQW)=Sw#R z(lyY#uyAt79rI2>dkdb(rO{;qmRd>^@klH>j!J@}P4C0!awqMFCeSNqL{aYOesOi_ zA^l=ghh-H{Eh(E5|2-%K zi@~$#tPnp*S&DmA22H2H;Qshe^B4l2BolGs1Enp69&=h$(;K8C%XuX!lGZ}M)w746 z+Oq1GbH{Dpe`EXkwC&~xwy($ha3uS}|FL%-@J*Hb8*j!*PEPh7P1|&@tTt)Wz4vbE z-irc-viF9Ty>X%p7gq%o1qDHwB3lI%MFqum6~}e!RiXW#_l)EuZ4nVH-hbcwe9k=y zX_}-pIp^Ewd47j%Z|^q0`drvM`y)O-Vf+59>Eb@`r|*?dYULNFb5d<^dK6Ne%B?Hl zkEjvN94%cwTd{s603e5V_`P)~F{$}wJ*x)a1Dwb5|Af~`UzlZB$GFToOQEs|&WD74kk|7q~IrS`qYjC+N8WW-; zJf>In$GVAcw5yMv- z>pS(;vx7^gc%?OKQ))d>rPdhh=cUbls_otbqaJyE!m}UEJ#uaFiEArPUR!#rP-_6a)deWACIeh^_3j5a`QM5zr;&T0=f#B0rnSwu%a)WOS1Y(Ygko}F*o#1M1VF(YjxrD?Nkr^0 zgn47O5IWWF(O+{awGxCu0U+e;T6>#>3kh+q1aS(;xO9W`@_~?JUzmLZ5b_4Zh!Y&e zFxhmCx7r+S_A~k;d<6duW3X6Uu{0pkRy}+A+#OF$eSBR}Mz97q*l?LUl!5et zK8T--eIH{WbTSUpKL%ly3R3v4ME2vsh({y)p!|I`BT|+acx8^Mz*SKZ*+{-(beY1bgyW4X+ z+x^la5VeGku;^Ui009x0eoP>Mdr;8_S%1nDAxy&iLC_DDoXb}7*eVi$sKto84ACkO zPc`DL;rV*-0zCMEIzgzn(C8ZXpR0UxPyMBR&7T|`_T^z<|M>aX=--Zyxq5QUwbLVi zI$n8dn{jlLFvy2m{lP$39JxRh8R(l8p@|IQd&v46NlbHbiBQSOZ9*S3JLk0z+M-b{ zbp!CJ`6m|*JwH`TL~#c9mV8-W9PFjK5$<7MbeP4~Dnuz(RZD^Qf_9JT&Fl`X}d zvs)sbSTyX-=eG9z`~99DzQzE^ww}-C{Bj}t$}6^ud&AD{GN0cce&wY3yH`yg9`f0K zuWC+*pgfzCZsTM|Bl(Hk+I+!?8qt&y(j_w$>z1jvuJ<~$!}r{QpifR4et0YF>U&l& z2KOT@0`p14x99zyxL-bT7$?j`=ksW{yG0ZIk@FEGGE`b$AZ;p!19fzmeS5#-KW?F) zS5mPkJ5|wIC(6rW2nDpksLSB`M=UxvDi`51MPjB*!P0oaI)B(Vhyy0!hT;qa2{0mf z{v{v`bbz1=3ddx{eIQ6k1fq`sDHweu4+9`PLlh83KX@i8{lEZ7SQM6m0YMmE7&!|j z3^#$04iFH5!OK9fAdHpb{jjEC3?!Wtx}O0Q2_!_fHj;thFa$3_wE^^j3$ub`;tYh4 zoqjlyFChFP0>VrnaXe{N4-Aj*mcfQ;`b?>huwtru@`Lm*X-pXC_TFR^gi8Bu+&N-3XbuMAn z(a2Fx2Ifyv=u-tACbm!oYEcKRAcN};UbhfXxS)?)=>Wk_j@>Y`1A`6;#O~I(YHREe zU%ya3kB6R2+0h4eN-PEndL2f)f|2Wp8h)Ym_2qp$@!qd6WhgF<=9+?W`F4HUKd2AY z@g=zZ13xps=hFxTe4S1w6yb9T(XU|$Bx+k~dBcPi8RgA^27^MaWIzm%)+byaG}8WI z_klPw3W^y7bAtdw2t>F+m;@u~4}CCk!ayg#OFxMi481tKD0JsJEOrLs0uAgKfwDuv zAidECwHDPG%s4nnUyqEOiVGtwt*=K&gkBfq!$x3y#2bslk$QMW=I4&OcjcU&k57DP zZCGlINGa+UeGEA3_>1Vnxwh1PKLq+9F4}W0WF<&nZV);dV4<@aYym8Gmx#TTVn40W zTf_lmDcDVS6qTbCYHot!nku=%d0Ve5vq-aDdf(XgD^ zZQ1iX8n>*Netz5HuV0#W{>ifYr-v3L!ZIP92b1*UdJ!04|KQ`*A26AGL6~;$2M$00 z{ot__c=!d-4@4zKfc-;`c&b4AhmSkg&x04}B?$Hw7<@%x0U~RNB*rL9icn_6sS8rw zEAl+*hv6gMSgO~#$AtRjL`nm-ED_SL z(}vN{l?=iJa*NRi_MV5md(z3MA zb75Gg5vSQa##MWF4%f|XQ+JdrN0#Y2ho`-`Zo$XLUcC1Cr`G|b+&v%=8KAHIQ z`J69aiFkXD`K>+14-bWXb=vg#3H^mVKF{2*m@!;fm4jqNb24I(!c=Zm0l&RgG^Jg- zc$#wk3eC2Sp8K}@zIiC<->(|J2OS{Ro=Y|`2KSSgYafMudfI>cCRuwkVhcylyKmPR z5%hzAhj2`R()v7EO9{smM1u!&F3t=6Xp)GzHj8{{ounim_VXRA_!wOOyan3Rm~8h)DV&jKlYF<3}zjoP?0{1Kr~217u;)i$$On zB%uUnAYOUH{YobUSI;!m%{4W4h7Vm9F?>x}(;{=@LUVm*Q1N*G+>w4c?cN#9{(0@j znpsH`HWqe1TYKN}QBQq1WB*U{5C6X8=(W|Sx>ug;UUam3&f(vt?fqfWbKkdazEZp4 zqvEv}a+kfCzTowg`6pv0?ld;sW2jjhQnt`Ns!ZrcS7#?a>&=P9NEpKg_@M*9}4lK@hE0>!tGs3!eVnhd`+2U z?UkeE+ETMTeY_zy8zDNAC6+w{^~&}K*Kp@bKPE45`ehW zqT-M6IwYajoLt=g(JKPedoZrcgX-e};s6BZ!WwUlA=)Io-(Zw*H-!u%c(9Yif|w%?m5eEnGH@$D;M`{a_I7AC$Sb#14Yn zKbR5(l5!y#mnGw|J6*DaNcSb$7CgJIIX)ipS^YYf>)6Z3& z-&_Cw{^m~)wS9HC{l}xDeml`|_2lSlr$+vIs^;zIVwTO6h3UB(nL6CxC)4VcVix;r z=|#0>a(SpQ7pCWFPSB@r+B9QNaxu%BNKKD*QFu~qU(t=!C5IKc|1Mgss+oi7+(Et)Y(x@3mp{$-k{ zHhCR<*7xlGpif`b|L~R>10Yd7A4d0l6m|7O^ZUpBpLI9Ku3^U_mYuMlh1`i zeZ`eol7@V4teHO8U(svPxd>timDZF=Yld(_g6IfmpdZoT8eD&25ex*T^Y~1m1d=P+ z?w+ux59}St@e9R*Fj(>hryus6U<)p8a0F-q3Bgh@6b8aYWr_mDr>1DG3B+E|9sD8y zAa(}`z##S#)I`1+RT9Mq0vHI$!i1*+S<-}-bPRxG3L`QFk%Z8FAizNE-VZ=O(2L+o z8>uL&GKEAICJSt1ab=5QvxITk!nhm)eZ*mMMjv7VePF`8A2l-Q-;~DxhL=Xzd(B!+eZ^thTf)4QpBy*0fk(F*6{)BOq^-Z`M#$q2*H|+LonG z-(0w8ck`z66Zd>O>(FnDUg=(Qs(bCJ?lmX6m%P&5dFa}d7k(bLlCy)8C1{{bPj?jRce7ifLEi?=}du0sgF#npSYrA=tR9W zQXmpASWNq0X^Fqpk`@b^6QgiK7S0PheTA3|%CMMT*@nIy9*q8>g9~jS;Ylw5LN$cA z_(1TA)V^9la5o5UAn9v7E){*?cTRVGL<~BM4TZ;BEr}6ood$i1ZdmMv!{@sP1g16C zP2aMi^ZCtnbH)Wl8JX}uVb<-fKp(vYZbJ^hB|}5BUTvtr_#sw`mA-0ufL7w~DezQt zWI`qn2K^o^#$WIE=ub3=&XMxWSrOTzigL!6C$?ngj4!EL(%8PSW7NZATGovz>}t>L z99{mvyos+pzTk^Ji@w}5bo(l6L$1V6%e)cq2cIke5#XY>e_-@Oj4-7LQ-)9g2thw! zwHVe)VNWpq7SX8?ojVt+KjjB|3G}`~bAZSaB8f7}5+dbkv8vn@^^k0BZL#OjD(`VE z{?kSVcTO;^ooiXYB>G=#lXh&#cxiL~(Wi%;-CgzWOZ6Y_Z~5X#+Yd+E|9gDY)sv&H zof`G~si9vTPTjD|)K=x6WfOSG*%BU60CE#z5W`A+hcN__rea(*=?HfHR_H^!_x7&2R6+8 z>hz(WuRiVh`Lmv%U+(#OW%mbFKfY%9c%R|iPQ!)0#t#k|KR;>w{8;EayR~cQit0;{ zlxR4{3@1e(*@?XBJV9HPaKbRjf@$)5m#F@=&U5cppV#*VUOpN6&3V(+cfxxvMf7|S z)$>u*?;lydc*AGgL!$B_43Y4b{SW~6KsZK!ab>2oxrk#9WC(eK{S~eYg5Ur@aY44M zzJg;6rSk`0qQUjQvcUU19UPOfSPTxr;0qy{lBLqJwZ5=V2q(Zu7J!6t2ong-K&U>D z2!v!HKp+BxDw=1+hTfWDF#3T35ZnY37DY0UIIR5xm_RU*41`cJDnWQM0YHG#1(pn< zB~xh05?Zqa5t)Jr2LKU}3`7`_0Ys%AwsfEtA zNfcLz0}zQ_@kP>vVtG=TBBfH5UZ>4%^(h`3P&O%~db+8x%QAGiwRJ^!^Ww;%%dAaH zj8(Js<`IQsB!; z7}EE51bcnL5PDy2sBZo65LXgH*gu?oAk-sv`+h&ZjvMVqMNiQYE|Qqej9Zx@QANuG$5eC9Zh!X(e@Hj$^ zRP3h}xGOnQjC;T=It<-D?qQceDGG|$XSWyUPAE?uQJB$DRKKEm^rK@&KR&)`-MI1< zV{*Gjmp|Aw`sGcXpY86tvb*iMHHl-YCH`8Lh|3_0PybjhlV9-m4zB?n-_vD#cvbvU_ouw@aQ4ev3t!z?dVWv!`v)37JKXxsE5m+1 zHsbe_Bd?w6xc2JMD@RHXK57_N4GEB&8z1aoO1B4n5cGrQMtL_S%zOjzd3l2ieKB|l z-{7k(Nm5s&i6TQGiIB#;b=eS*qhYhP3PH3{S)1cEz1eH-FzwVPRY#@!+g@7G=m{ODxxH|Gq$z8&6u zF{0;kRL@5dKfD)w`UTD6*+@hIpvRGcbp$mhkF0rwc7$uf8DV$j)I zcS%v6w5E)o7z?=5VAN%B{ZB3&gD@ei7=*_Z%OHh@`gxY-C6<<@=+@f2 z)Y7=vSUFQ)J}tC#N+`ye9}HP@HgD;fjIL90lXe*@mUzb0DnipGzR@h6jLu{Y znm`8E0ImT+A1-o2A7oDmjtPi~D&VA^$$=4w378=bL^=36zi3-RO|U*jt<-Qhuq)-j zkwI_!2f0tD5r0o4j;HOEf#K#HilJfT z+g-=|;YvSba=Ab##P5$rXL5L=u(;fsaf^nuO)*#^#WE>_#iW`pdIJzV6oY4BD6-QA z>R=S=0(~Hk=`eO(*APN&0U0>W7Yt##k@I<7xsg^4~sU(WX1%VgGEviJ~RjBa-~`iLvqrX4RB#5n}X1isxT=Kyn^S$!DvCY_*83 z5yM&u$3upAVfGJiy#2$IAEd+VAO0dsuq4VPjkn5E;}qE`>XIC7HD>=9JJf&r=->rY zOl#&xY*-%i#63yRZ_GUKc;4~tCFk~3T{=+z$)TpNjG<13$4MB__p*X#48@mh__ZvSxZv5<|;gdtY&poJ`Ge$5ZlWjA>F=3n(8&Z(MtuElVRS74xOBc>i z+`Cl0b-m}o?cQhi`+s;c0m_K{nZ{OpJ$sMp!|CgQ-%x38{ z;*vC3Q!zg+iYXKQsXo~M7YqF$5{rZ>396B;;=&x3r}nn@%?_@?btf$JeIGq^V6o|3 zjDg72EVUg?+3br$6he{ z0S3Xu@c{rK7zn6B#Y`YP2LnNs!Z)Y#!_xTSX}AM~0zfi=3B;NujK~rJ29hBHJ3x3M z28aqkh)NJ#WD164AflK|l73`~;!pt$B96@!$K{IRb5Mx^3BeSfOL#xx^ThG_5}*Q7 zR0e_pkc1)fq*CAmNvn0wZ1&0@?pHiEsBE&aVZNnhX+-Pth?b?1t;-`@SA^FsFxSjC zme16eO$#cTpf8zfD4%8l03x)&Y(ZPwl& z$L;vOar2eDWhdjtZLu`nZLC@qT-2$Js*;B!q6dGNb#rhHt^rt1hnT%4jt+<%r~Ke- zo@R#t5R(OL2N)MXPqF1HKeKH}TuQypGk}XAc6@O?^wAdyv4akW@8gDa9TL*}PVCqJ zaTJJHGy;f_At3w~wCi#YLNb}$Q>PP&MEIT2nUGxLn_V?>=*+uvE1JA~{U8ntJ+bfO zd=SGR6z)N{Ut<@Y*iu_k8Lqh)%machhyg(i7Ak^>^fB{;^nW<+$0ZJfqlxQyN1R9H z_NE`#5oH_<-9982aBBKJGj}EoT4l1^~nqAPx_aM4M%a5%Tm{ zWp=WNdU=Gf4M)6I8vMr>LUyY;@L=Qd^@d@}#!^CfS-So!{e+D{KR ze*H@8PsiJTJ2mR+s~uNgt$yn{(}ZE@sq`I*KAc3%b-~A6-FbNz1{W4Zg}B#cstV&_ zjhqJEOsVOgSm+CYzSW8ZNRUq5R^qdKEGq5fM&Mqpqy8qIHI2>UfH}5B%CWV)XcL{sy&bRCKYP(=OsSZk5UuJMCdy8Ow3^#hGds8j z*B!mEqha*;41(zh7gVGwwXk$;p9K>|VIXlB@rdD@ zV=?G~?_=~M48I05frKYGr(kd&2+2Tj3}Q*=ThiFH%WQz$aNVXU#R}>E$3T^THYzn;RBbnwCVit&SSLCSvF^Yx9!GrlnyuT_MGj19LmP zl4^X?n@m;Hlg2+#ylijt=Jyu8+`aK^_oj2*o6dG`Jkx#OtJhW>y*l^6Z)2bTb@=w5 z^A?>>nYufyezi|xlQJ}kr}SsAd3W?*G6vWG;=0};<^YipU;-gaKX7M+{UUnuNz9O? z(FJ0)e`sn_c87mJxKu2I*=z?!ut#ZbAO&MD194G5-jC}55SMH0fTA}Z>HAr`WMLeA zAlM!@(S_zb!G=mg92XIUqxI10bUrKywBn;L87{WNS#p#-GeK35r717;XsFP&H~CE(88mmIVa06AgNvgcTb=Oi zgK7Kzm3`#t!ZW)|-`Q9F;lcVVM_Ru>-uB;#aVH=l{>nuKVTw3}!;Wm4V{ z=+6GJ+kifZH#?&K!>LJWAQ$=`iNK<0y}B$#i4Ak1#7fd+%%e>cpvEu6)=HX5hZo^XmFYv8Ct=K4P!^@*--{KJ`%}{=N4!1>q~{BTg9`-%T~@)K6;N>~aH z*fW6R6Uy;7AwgkCa2RF+A<;)D-i8{<4YdIoqPRvI7Y87Kf!J{eFn)j?%mhO0n6V}h zGu{M}2nta#^uaSHgDTW89DttEL<4JHr|lnH#!nZL5J=mq#=%jci&TR@d+{s!?p+M~q#=#7(!S%PSn?C@(ZD53&f3XKca0&Th7R1I6ir9$I-OH4aG0bRA z)~G$W2$xQyd@r$#{8hnF7AT|py4RVNv z69b{RKAiTiOFx`*F^*`AV~#8nvxNXN2#X2f^aBE!2PPSixo$m3U*)S*#$u1m&|Db^ zojN3!=4zsF?nk9`fY2CZXGrhyxGWYVQ_0LRVa6D$S*|Y2G9q#1^a)i-@_q@2Ju)jA5~&wR^G(&_@?aC z_Wb6%hELxyYwrH}Q+Lg4-88Lm$+*ImQ=7N1o%O-4mERwn_rWve_f7MP(z8X}8$utH z(YJ*CLkLsQ2kHF)({Fi@m+*k{3nSivlq z;7DQ|Oen@cuqF_mAsWaSjhR4Vc_t8ep$dz=#AEyRDpY(N4AuUDZNnS@gddhJ2ul~D z3eON)(uLLx%mIRK(+Tefy2X1?BQWj}nL*@V96^{25l|-BMrRP-4=DkrE*kBW%8s7MM{-AqtPRGm`~y8 zfU+ru+IhyBdB)m#VNHu|ZEJ0&7z^cYLw-*v}hY{q@mv*B*PLd(-Pz??3V5%7foc-u^|?Lm!kZIU3V?Z%E#FnQsJ( zBVfY(!8X*vb-UMX!WXwn#DT3F-7dSonaO~K5|8kxGHX<^r&pjzC`3=19b~~dz(TF~ zu#*t_joCt6f-}U$zKT-&Qm+v(eN3_G*9t=X6Y2M$k@gR}DTGcQ^;6IXxJD!p=tK1~ zxtxI+V$qX-o&C4Ufq% ziCR?3V-yS$Ryc0YB2WgnNPHC? z2&?SCzLtS?cMv=H*Mb`mJOrEP0?~2wf!=^d-UH$Hu#=DhK_8?=wBYh{Xg zNNoP}@~OLK%{#JS?vX_!pO{&`YC_(k@im*5&c5{gJwF~<`qhgS_s#T82;)e2H=2Cm z+mkPp0uZeD6hvUa^ji+jKmhuX0PhE+;IkA$wn~JBU!U)~{t+39**~HcnTg7R40Tz7w!Tu=-sC%JMBwbPhGjFt)-8y9ba~wN`;zxQ zl681n{%gBSF6^(ke5mHLBTYXZZ~gV;uQoXb;M_8Jwnp6|@ z-jl0-zx003k6-uv@F7(Ra~GGUs%H!p7pF1@`lY)=7y2fuQA&z(RAbus z$+2|K;3(U{HMst0fg@uEox_C`8rVA!2{a)lc3{p(O=J-&U2DUY;jnqwkp;ElgGRCgYDtKT8-#!hy$m4)MWGYs zkn0}J_jhnl>vesf*O1)9{STBoha ztr_O7^Mbh?I@2lhLSqs>5J%vJ=~{g1Mp{IA6B1{y2!R^N0WtRGQrF@RCgJpeu>1>F z41yqH}Cyt8=hPkUXvyCkh6pwD*fmSgTMs(09%;J;{f`B=U+(lL2wT-0!h#vKtHeu z3`sv!VvbtMahGvC<*=6=)+sqYDz2}Z=kLx7^5BPf2@F0WbAUKPFOD`#6C>mqamu_D z^^hEGO^MggTJMh5fN7&c7EUp)nQhsyIO@r@@z1SK-T!#bi5-RK_LjbPpz7a8>b^eO z{PXda|DLG2_(I~QrShn7rjYCQ7stNbhOUq6p%45$*|Bc_ffEfIw&Ed|WkqQ!)8$!F zEV+2#n^FXN!gS@7;iH!WUfQf)FkV!X&rObmBaN`l1Uf)6 z6S&1$yt-0BN2_SYIO+1a%7^dL?0n4g#W^SMbm_Ug9OBCh+!Fy1nu#vcg0|cu9 ziQ_pOAn|~H0Q8Xn7zm+641nNr0w4mQQ~`*>BraDH=ZrpZB@{>#3a~9kKjI6e_6SU3 zk<0-=O7RX5St15NlFH>tm5SslWoiv*M$H+n%Wd~A7!@#NVsQCXQ(Y%$1!-Lw(X!my zydf1q;ti!-)gUVHePN6%i{`gZq|=db!yoZ%&J1@gPTI#%-e?{q&>u&c8Sd_jM3V1HXuyIv7qc zghgXeV@bUVYiUe7+;9>xAeg*}-;59juJ9cI%Iv6ZAm|5;#So}O5hZcC@AjHGH9~k`*uoOa;Lc~&vV3h>cNMWrE#vCAsPQmq2asAc2 zKrKJmL!j3QP5welu*hbR#9L%3QHrcYRbhsEd7(#rxo$+G@1*v?*<(YNO*7p$-}>mX zn5XYe-up<#k!^XWcNf3AzwGj%>d%if{BW%KmlJiL9f-YqzA`?7B@x^_{a{ctet+SO z@W#;xoqRK=Rz}~}4^R$^qf<*#!rf~#rAgszrIdE(Od18qo5^;Ui_#+9CpUO4ZujUK zp`KJPA5rSnHNv`m#n{h|ZU5!NH+sJN6q|wjeD{@+zhB6`ay;Ul7Y*n37(aN${PnA0 z-@UHCbkOgGht%`N2};sAv0-p{C+Zm zUkUpBZ0Ii+j8`w3uU<5MbJpkJR{6wHNTh|SQPIFBI0oo73Q<9lyuCu!P{5Q+XgAmm z^8ad~pOZoXFELu$QX?rXf;8&EsW*dbaNW!Thvp3QZHEqXnIaiWp=G=Kz@EVzKO+(p z#tpG@Ln3*hHl99;iwmEJYly~8AXpQKeddeZ^^xEtJNgKBm_P(!$(T|Eb_^1pifu^% zLMVg4AQ2gM3_|vSWY}lpV)P@OWFVQY!s9T}*`kAKX43!GmtzWI{-<*RbV%M z*wF{JQ!Gos!Y}bdWQn+N0D}2I00XH|BvvVss+B1j{WfD z8&{vX(EZdK|6PCV$9d0xJ?5eFjVlhvR!sLnUk!yPiz^r`0~uVmY7IEbxCx=BPsD>~ zFa=_**;X2#(&*=BkV>RXHnZ;vQ%2w340{s@ZUG@M2nB99**_Tlj*PMUMsD5Hbo)d4 zL5;)UJ`k54R4$h*l__8j;zrB?V9PbWiFx%66PFY>b@&8_AbhTq`N7`KfuRq_DIvpQ z1;N3BgNKmVgg9e`C}%y+5tu%^L8xvJ*J-v8uzY|CsCWbhn-K$nL=2PZU?9Co2w4Dv zF`2$YFc>ZA>lcegd?Bc$aC4)UY%m>7APmO@85$d5`Ro0X@{=ry7P&^wz)C+@2rN{q z^~s49GbeWK-7@dFhs!3lDZG>rhk2XPM}MPXTpCcFS~#3?E)FXQonqm*F7dF7-tRy4 zMjyDqmDr+TNDBPQlIP0&<_F3Q~P+uU}|;;;#7T)~D=yJnQ7n{BwIt-aSz9>C3hMIokB| z@!BtrBy3#fk(>Niy&sIf$@M{%8~ygP5A->)Ada8Aydc)2C0`tCV97}j`fG2+ zetgjU)(iS`d-U%dF@E-H*spJzzC7i<E2pk$HsV0JF$|Y%{0NWl3wmZ~{PV;?M9v}erYmlnV9}wm46-b=X2^M8d^h4AMKmLWF2&#LfO-It-2cb~HC9LkQiGuesr8 zdSmFLA5RGS01yu1<)!oV^kQOvO+)XKE06?R5-Zy0v`$?fm6GA@>%)RsB=m3uSjL!F&P&(2%U*nq~cR@v3^v1hmcbo zh5|Ymbk}qYqt}cW*YZ>XgD{J7VJq87{m>Ch5+b6>=20i_^j{M5VvEicfMAL1=E`U%5= z#F2VQY&aPHk`b>gNLN?nyEl}14zKr~(B?mDbkL$H#=E=1H!Zhqy*K`aM^X=O$vU~S z@cfHq?;ouG^yT`mkJfy8FniA?U0DvtT|v8v(Zlw40PwbnzEJ@EO`j4pq5=B$eRMMU z2>Lo}%2M2`(xeGyrht1#hc(duG-V>h=qD{n(TuC{nA4`6-KHE{t(jQovt)F}i|fZ+ zI`H_IEUNXGB&-Cx(=5J0LK0O|A{28yuR!T?K z@v;+On}KZ!W=9&}I148O>j0@L=8tF;P8}^?JWIZQmHMfNwEMT~&K~mr7MHURBtBmnUx10EABja|0SL}OF#89dfJRq+uphRz-Qae{d(Y1_mK~-?Yr>H6DNOIvGa1v+=nxo=7%KJ$aO{*hd&sE z8C*BF2ApHuoQMMe^dt%5s6CC=n2N~Q5^r6AP$bo-I_Sx!QmOI}2;_3PZrEEq1i>oL!1U5# z?Q_>;DvP3n6jlGkgZleDp!CBHqO%2@;3Q*Odw%}(s@Rt7A@ge|Y@4?7+}gG8 z+&ll+>Jd-OE5CPU)k6!~4{q%G>cxfs**E6crnruBttAi^gW^*c`ay(T9BCJd-@^%g zurc}p1c^A1m;>mCj7JqtKUhjo00N|zVEGr^{-Hp?^ji%#&;!^%48B5hfG8qV8f}&) zM99ygd@%Y^_J2xcl+njOinf$YRO5WXH z_0gf)FJ7tp{N?ng@6(lLb2Rds@qW0V4@R$!=i4Xe%F|nmLFjB2H^@_6lIY!5D2+F< zWWrl`=eKLoun{l{2|wB>ugP(r*5uhaLNldN*4rhpS~VFL$92y8RL z2@yzoJW`U)tuGa{H;HDBm#myG-?&=+>?0m8Kj(e^sNd&jgMYc8|NT;zU1400Mj< zX}|}9m4S$`!MLCkm5M%GtRRsT=s{XR#JC6ml1(ZH48x7dmBi$NomhMlE`~nh@})r3 z2n*uzaeac1~F1B5U)qsG+N4T31Kbc7>JAuvX2n)pf?VttgzgedNY>mhbxH zp(9`IefyV_A9uh0$+bi8Ufq1^x4BQeS2cN^F}YmjXW>cR2TdS@>(8zMhZr{}29t@? z5A>u;DA9(Rvl25}Lqa2EGC9PC{_NZq`w17FG-gl`g9BDj&dVINA-(UXcQgjSUwelt z_5S}1`sn){@%lG_VOS)QAY3l6GJtMa23H^rGRN1CTU0%2R%TI!&PNBapnePx{h<&0 z+!K<75KR$8LkQ88N|snUX2jTSArL7SLeh^Xgm9tsrXP49h8U6yNC+rOg@|D>{g4p* zolv<-pSc*iV^LlQvK7Q3CYvr+3N6Xuu~{)%Ul07tAr6NpmHJpM#gjUwKfQ6$z9(Ck zP7jR>XCctQ;|?nHxW4R7AoiiRq+Ns@ZtIx#LY?#C~ov&IB2o@%(KD}2)m+m?Icc0H7Ga7*^_9ffbaSa$J1)u)GRK0lIs z;IW|LHLzOtr@bGJpCe}ZAOXnV@hJiRmPfPilj%URE&4B5LKqyj!0e|fOZKQm4@ZL` z(Ld~O@ig>3QYqnv2g>Vm+^08rbhc}zx5|fu2GoG93(C$tv+#%W7ka=9+>1Rw?&$eq z-qjDv{&PC|!i$DC_UPZ;Z~Xd{@ypjjFCX(i{G@u(L{V)4C&9up2eQM0*^vN%a5CaK zg&EwsQr^gB;ncC>rE}!#SF4_S#C`ux-J7rYe)@XQj~7C(zNf$XZt%ZfRm_=$#6~e> z(t&=bERy)ZwMsg%3j$)2LYHMsuQ77dizvtT;HX9}c{!h`J*fcTlX zL6O|hXr4ZnXNcpPVu6g<){F`;5I!zE3u8~dSP~rEgNi=DMZ5ijWFXcQfh7&dnvM%Y z9~k|x3m=TzCjhaVKq526Hd0Ow5X}A&og<0K5yv`2m_TClC2_ep0FlIlDpYBFk;LAB z8efbGAA>6e^aHnll*w@=;i@2%jH*(eT%|~hBYjXXjvZJwkEFa?%1}qwuVL4$~h6$^P=k(CA6;282?Dw!hIv}Kl8wgA0K+> z=Qls^e)o%>GoN&Cef_ttZSOYD+!U5tqw=$`xuSp82l3zcvH0rPzhT{(VD+!@~ z;h#qzHvmKEbfHMd;}hO62E>x8yb|*2+GgHWGjc|NK13>$Ku{mUWL?Yt^d!XYcFq@`SR+f$2!Y5 z%x~R&-}HBPEc)TVtPh^9-Q49H7cS7qAU=hD@Yzgk$P1Gk@8T4A5yFlgR3f$=fG{O& z2nb^!G7csO17U#z5CKaiWUEE6Mht85_75ejQ*nIMh@XZVpydU7@eSSrlb_HUB#JU( z`Il&UW`d$1O;wTW-c;r}vfg|0@PN(N$2By!-UDLjFa*hjk~pJh zbFQW&iRna!!6(dkqWqB0kWEG&xIYHi#xQlhRR2js;4ygte??*cIN}Xd~m$y zo6mZFx!CjL{+_Sz`Te8HFHS{YKB#|Vcj(*u4IdvjeSbFe(_;ZgpVmIGSUR)sbyCAZ1uBCK( za{GP7vv-bKvw!vW^V?th{>^`PfAVe5hhO&`dawK5?Po{LT^E(tj0j}|{kt-_{sC*C z4?u5TY!(~*70=BLjBQo=TH|XXqKkB%{wk#kJm+{nim|p`Z^J69}D1meB0` z_8satUHd;d#boToBhJYh=er`xLT(m)I2ednERib|Y&IMFi8BzMC@?I(e*Ds*(^s0~ z5`6=FIS7XuOkmI%jNVQN3i@DB=?6r5GcfewhWkB8D1kE#J6-@6$w@KxEm0UkK_52| zjiFIS=u$&5Ws0;#80XktRg`jyLG**-Yv=VOXFjLNAU9 zmnPa|>2aX`v@}msTjDva#(Pqm-<&Z)%cdIdofo!gX~g4e<92RHKJa+v(e3$X_Y_~; zU-sdFf>Yb|(}oN6{x{S6K}8?*I|O~WhGMWqvqN>4f1)v&u!lktXYg#yQI{n0g1qSL ze|YC4`VNY~Y+tRcB11E&PPcT7$NUlM$qn)m<=RD~qW7*F|Iv|Wy02XB`RTKsU*7Hc z;nAMY$NcnG%EyO|Z|x3!V{hntFB`9%He7j4|KThC`!>rb59K6Bu=KtxV*uM6jE}*E zQ)7{WG;VbsedL-x>bvga5$zASzE2Rb_mB93MK*%uE90927aN3o#>Gpiw+}%6$CI4JvY$G z(??_Wk2rh~426DR5g1|;F41}_aFHE-Sd&o+!;^^}Yl^^{ib`Zj6IuWO0gA9IgWUET zgmFS2Kv`k}ePH$vbSEkYyNLThvN7~Q3U`3S=8NMBq;W+!0FgM+4~GK;%fDa|n8YEn zq#^ReG9V)VQjV9P%9E;;Nfk;50KtMVsdcKfdR2M@Ds^VFCc9OWJ=`OAl&)}$U&(}^ zvgv_k(+oB9tPP7J>K8=Tc1G5AS*zxzwBKLWwP*gr$F>~);KZe$KmMj0)#=MuXFq=4 z(~!VmasH0E_Jix6yaxIJ^kzk;bJ!fr`vIJxJf1wzkQSd>9~>IxrPZ-v_DvW+`pw1A z-CR;C4mqO_7w-oZYtSj=#HId}nz*3~`!YAewf)!ZA8a;TsaA_561@ME39+RrucZ8j zVKeV8Y#JLG7q8Z+05rfSpD>&U#@dkx-R^}TOdyV62muP{r168+DceAmWMRFMu6}VBZ?zK)!mP{QCUBuwb4@fc^snv$;~K(#JQgxpwNdbt{fPGvSfd zaU~gi32)$W$E`*m1OQ>V-l5}PA0?Xdhvt?qXnBJ}{?l>&nTmZ&~u~zS$q|tlzTOQkTt< z@F8IHz_S*wu zIy_*(_~4Z@4EN2qJiI*Wse9vhZ%RA7HT(3=g17gUTt1NZ`ZLy*)5WGh8jJZS%{g=z zomO)tPOYtYMn$;qLh( zy-LRWl}_?6ofKFxJ-B?TzI2MIY=*URZra#~s=A(=b@#JtH}Bi}%4f5;ydM}_jEGg} z;rKxRdJL{RdJR0p_zS|H0(x@KV)HZ}#<$WL`uHm6`){@H=F|Tz`F3 zS=)@MYqu8FwE6h?fkCoZ{{qerCD_0^kt$D@y% z6oe1Qp%DxOZwrAOKX*44&5gQqCyCBtaOM2a%XC&Vhc+(z=|Jb_FN{3&fTcc1>aS&ip|>oE%Z9kF4iHSesz0a< z1UG?*NC$|7loXgiSW<)~1>qN#6nB8|F$W07K(u1mQv!qb4>|0k;`phN0C#Sn2QSEr zAL=782Z|y>#W7*hq)1s>tRg2_Rhq4-DfVcs(v5BQojEdK;ROBKS?2W%t^ZmXyW@eR zeUD}wdn)(buA=u|DmeFC%!3PMQD&w9xyjeF-=5pQ_XC7Rb906t_+^3_73t_v_bQ z>iPQPo}WJK`RQQKf7V_7c<6WMqCYxdIKMmO%XQu=zT>=xBvt$Gy@SPCDG8Lw^3hf?IXo5JB>V=8Ul*D97W3reo zm^gZKWbrvNfI(>Pk>jHu!1ls05E_7x3Hc=8A^Gy80`HPZ4E>NN6;bAwA|CW8^TmDm zPL`6%^m^Y)0}w|3p-d^GEHLFj@{wA>ia^TgRi;%a(khkdRTKcB=|>fVL4XmamR?n6 z9i;%F^FX`@_3A9ZKtLEsu6JnwGKtMWZDe&IY#2yBWrxX~%=E&5U=RR6bO3-%H}>oK~c_Sa$%UnMSehQkzm zU58(w2akSmoiBXt2ko+<(Fea3ca$Aw9P}{;{U8X!U^Hp9dJMw=3_&oJ!Ioasxa{)X z(}q?@B_`{2dbZpIVs9ZDg1~IzCv)i!jZlF2H~@Esr5uni5QFo}AiQ7nGgrP4eay-L zeCZ#wJ|qa?xnuZ?920=BiV=q1@Pa{DKMWg=3L`i$#n7@4Iu!&$$FjrtJT<(G5!PkH ze0;or6RI(4GKw?Oiqai!J5FHU2NPm3X)uOmrnjzMy!G(z^B=i&`uc_8sj-9vJ5%V# z??ya$dJpDqkpD91gT9OKQeV!nrAlwb5e2d3^XsdZx0cMSZ@;YP!dJH5{{5Y|AK7`? zUvB7sVAJFstDCM}yYQ7e)_$>X{l6aTJ$O~-P>UfZ1ec3w^ns2>A5x$8g9-rg7lF{( zrz`;RnO{`iB`~EBQ-TCkOew~w8e9NCbP`-ABMfpN|F9?sn~HE~gibv$zl4}Xp=OEO zCW~;&VnXBz9z|NTGAluyo1!Vp(bW_g8Y|5mApOI>U}nhbLHFjxkyoxxxMg$dJ=?P% zzP{k8J4;`BuOCk;|kh zO0>2WtFz-oW}N^zcYmz%{$Etegi$WlSQ1wi85cv2*h6;BkT2rF|%Emh(flcjTelMaFc3NI|)bYWgkbk`u z^688AgLi3GFBGOHBU+6BJXo zwJIhI#Ak#7E*Oe_sB^sAz$rk~IgMN&F4GH>*F*sjz(BNl%|Hs0*Xmsz-3wDNO<&xu zFX_;iOxKsr(3j6NRCXBv0O>c?4w!2Pt#xy34fCwEgXW?RV@AC(xk74m5efs0iGU_2 z@a;1&$CwGn7r$viL?S{7&tRcg5gu1jSUHrKT%uO0MT7|AhzI0@9zKZ$KjH)OD}4Di zAt8Lh2A{Evf*yQ!!S~Csgo8QBpbr{}__yMYN*59EOfknq9|(ddluDb!Nh%cJqF&&= z9+#P&kp_8A%9n01DW@iozZO`r`~U8I-KoL%@cA_>3>31Ry>t!toG@ z#UPX^2Bm-9A4C_P^3qc&Qo(YM(WV%#M21cdVSbOyNkNcfMum*-$>o)ipa_bh2+csi zEzFS+S_c9lkiQOu?VaKBPnf}Q%;GesuoegW;bviLAEIYOBpL(4xj<+=KXQsb0b(~KtT z&~)e0zL53vBDbxKyWxW5J1@<6=-TW9w-!FTtKyYCWzXN2di4flNjA`aoNVds8KU}N z&45XY!y#Y275wpG%buGxs}>7W5+SMd98W;?zLF?OaZ;SNzf;jz zg*hze`1>1}z?}2reT~6zSR_T{DpYI6Eg`~?IB|FiXvmGplu}XhP%aqS0z>uTGI<~@0|83`kQOcI z!)?~)QU??R(dAK@s72Fs#qIjy=>UL~b?Pf-8Y;VuRei?lSrh}AZK@me9vDk!maetmwL*O5LRI_;x7R|s6)&<5+vY* ztT8SuaDs5Sf-P1%Arg5%_1>#{u}l@6S~6?p6}>AiEv&3ps!6~AIKvC?$hC zr9Lz?ciNPBw*vaH^8Ovw15+K*!3YkW(dYv?C2kiG14~Oj1XLuffL3=Ffps^0e#@?(c3=0;yH*^&YRV0(C*OQQ z-@zTL{<(kscl(#Te{ant^X=(TB9)Y*AN~ob1anKPJ|ttI4-SBkj1+`J9|%b!5fLgE zfm?+bRf#bTrTt*CPl5SGWK)YAI+4>L2HFqG{Nk}oBB=70xG*v`QkfB_%1u-kXKJhR zb@e62sdbj#R@>a^u9dSrn-)cGUmbVjrlg(Q(jU4m=keQ%4&7h=!b63R++v+nCNybJ z?qhh&e4^9;GQwn?3i$ERGz{_nw-({j5Sy_k+f<#Uhz&(V#2@On@B$P;vpog|4&2LJ?!KypA6F0~W`$>S_A zH23grA}#-5F-Q`(d<6)LK4{@bQW@oip$soP`k_o_(MNIxjXo#_Qb7@q3Wj@d=p(ht z$3W7m*sWHkSF6%%m<0@k5`pkAh?=#)sIwbXId!xYgaROb^n+4;fYo?!X$F$p3M?=M zt-8WCeNl(5xID@kg=-IP&7@SS+9x7Rk-4$S}Q_G z1c8RE!1&LE6O7-o-YZZP#hA`k2qjgvxa5YS@>w2toKbHS62wT2hk)O!!Z^7Fqlw3_ zW*}oy5ni7Qza8fIKa~56L%76Lo_NG(nc+9l91DGTFV(erz1`_js#Mg2VGI|mO|Is? zmGd{>(l}$t;;>63VhU)mOaNm4I4x`dpkd^d3hXn;2pD4wG!FWJ`DzfzrwQ>d&!rtP z{JX4H#CK`T=BY9#`BoQXj4+UK;z4L@466*`=~NgFLKo$70EAvH6$IhpSb42Cuu`v% zNQp`+NVa<%GNlZ`U|cGe>9zKR_|o3aC3jzU$@9C1uGyI1R--hiPKWIUnE=&?!0#?g zJXin%BpY+PV0~&+piIboY(l z-nZ)ct9tLhXv%FHd!N2x*++ZUeY1b@2fJ#v&JQh45ozUg>Fwz97a#(W(R*z4!CO@B z;~oqT0VgT?L5eVy1P9s=ko$pC<`8X_QkI7b;Km zkZIAXoCI}Ynz}4oTVJf3Qe~Vm$vW8XT+$PI{#?(NrBPR}jlcP#lzXqte)Q)2r+1b- ze}DRITb-RvVy8)fpJ?sNnS?&rZ?W_N_3fGZUM+ydxGd6Xtj;u6Wk}sNR3`pIaSwXH zw>6oB2zScLGc`l40D!FS)z59y^fz19&PsjYvcb=v-|?Tnz5L5J?}7r{udg2dN9WPE z3cfy^_`!jQH}*&T<=LpOUyb_irO+4dv+UTcS=1vb&BPPKf&3#T7>f_Xk|OYoXd*wE zD9aKxm5MtiNd`ORE9WaNS*yA6a>MRhEr$RAaeefv?a+Sh#p@*%C5YK55E1}boihVc zR)pfzcy&jkrn^lT8S1?okZK1eFz4ogKztl@#7GsG+K3w*gv}##MTXRH|j@{jr<;DxE|GnaIlvKn>qg>rkOP-(y<3J6C2fG^^K z8FMBaU;M^JQ4B><`a)hLRt9^r3d;HtlZvfoyI3qb7Sn(PK^!sgx2RCR@f#m~{6;Xs zCYt&}LZA`U;$+v4fp90sT&YxMwb=~@6M}fJK)gTLqC$xxqqL=K*`<9ewkBj`YxQ~> zeZUaw4PgR2{m}>YZ?Fj<^j$9TLcl#9qSPU5@abss!OIBo;~|VJ#1Dqhf)KUVCV-#gAQ&f z(7{BWVl4DPA)gfF4C5a3q7q!^HYYY@6wI#9oLN>pzhUvdwKsfr$G!jAcgwdAY!x#;Nj?)uox5ntW|jsiC9JJge2daHeb3K-dKfA}(DKyJKVW-P<$vT%Y^+ z?FCQoOuzf`;QlE>tNuitFJlLNOd$GTmU%hwe&-Pr(r}xpA=lcJFAI0Te=xnrh!J2Y ztdJ3r!Q`Yu{ron|x_;Bj9{v1w-P|c5mn_IVaNW{xU)wYM<-5Z_yf^&A-r=t<{=dJs zAAKwFt3#1*JsSS@fryWvi}>`#@Q)9<|GeLP?M7u!i!du5jc}q74m2tliw(n*DF9NC zEG*9!O)3+2Hc98sl&@Z(+_qkG`;~@0w_6T9Vt?z9?Ukp^58k0#I$xBV1)oDX7~T&r zW;dzZCuzE;Nb@rxvGAOE*8&rmz#MZRpaTIIL?}h%YD{AxtYN~?IB{gUBqm!LlPito zi9lEk!kAy;8TkjtK&TzTKnhtBQp`8JFmWGaIA6+H`3I~009&a{VW0=K)j<1^O6xr; z6@YtGDk<*aJ)=tZXCN6hv;suUE)|Gc!xiJw41`ySJ4xfcrK3>us0Agt&6*s>1q13} z82<}pfdTZR)4PVUnTGOiLuId_dX}+nHlQCA05Mi{8w#cv)9WM5YXWL?m;=UQH0RyLsN6xiz<3ULLwCk62ain$bw-GTv7)c=+FBZ z-1kU70}Bf%IQ<6g{Q#HY>|^MYzmAHGV}}`cnWxRjTEKH)tT(>ARfv60A%Rw>bB9ML zl}b7Y7R7{mYgkER&!UTOo!oz3Txy0?CgZ|6{Kx|ZFqjJz0ZT%t>etcFiSd4L(h+#9 z^SrDOKKx*_ML1F-7`=2hCItHwAoO|qE?1t*mErQQxmcM8d?Eluzy^A77=&ky0Sp8L zn*ucm?xzN!j57#|xFTJJjfENIS$dlRmk_83mur+-rz5(kp!bT+TMs|9@xadZwR3~x z!Uzd=?x7Ekb&OsbdVq=_4Cav#m{}BT5Jq^3(`LR;(&NNnM<-sm{|il^WXX%(Et27tC-j?+?9TVZ`<|u{T_p zv~zpnb>-x2`C#yPZ_2+d&K7Gxi?_PU$_?yp%|NZgs(btB*-!c4I z=l|YK{^zsdFYOM0{n3cOJ{$GJn~~qX>3;8N`#skvds~FL34nftJJ3iM788mkdhpaJ zJUgB!N*C1>h^Ev?dfQ}+XOkDKP+zk}f8UM9$M3bi_N3#3mu!DJV7P9(q$m$oD$e#m z3;~K_786-jtQ+i<=A|KOa-yG6U;-1Ei5c)Crcew^m8jA{m_kLaI7vi?G$x1g!sN+( zMi^%0@hk&j(TCg*eH8fUhffVs?7gKLZvhFR4?x##%9zm~-rGuseo)KGKdR}axrYyZ z(A;D6rq?o?!SWCQK(=-ZqIih)eh<}}ghgW5*Q1w%FA7Pje%rs|5?DFD)8 zDCsnm%rKPBG?aDGIj8`DG|&KKwykc^QqgV7ZPmmTNUa{B(kPUxAtc}^{6o)#vy0!j zRN4ab!;kmEQz|!jV#>;D=S9b4>a_-3h#z0M0r_%7*~pEc5e5@}iYecJ66D_(Gdk|$ zSD+8Rp~YXwaUAr)rGoJ82GI$q0*Ds0fb(LB*x_=SEmjQ2L9`l-%9Z+<)Z*Udmk+JK zrl_{X9_$o~gd^j`3DNYLPTlTMVBSz_f_Q&)Rru4?7d~dO<&x7&(Xd2 z{`AOI|Gam>lUKCgdEvDCFPs0y-Rr+Qu;%kerrxtTep;m>#Ei%Ycx2HnwK9M{AgTAQ zLa-nJ0+l5^1gxuh8yn(2}2PT zDb0w{Os_Jnm}%KCU|c>^KYyBj!PL0x*VVuK$mQR@d+7iE_4e?Q*N2bn{pG6*e*RnI z*Doi3a3JdK{o(ID8S&BKs4rfQ{QUXgr*|5!SSRnO!xKGdxDx=7=wK`^6iW)n(_`>F z$^uhgEN*X*^moXY%~ft$tJ$&DaR1GwCm*yPe$4i#{ib_v)~sDFE-8T3s6|Pt$;0g?0Ur2)JTQUz0}uEy7onse5?HE4lzL2OCv0v}NF3;hiOK-6sQv(i zPD7>SANe!`A;ISJ6d;BE^rJ`twphWT53prq%4qaKr+-v3xgRNf^9wEiU@(Y^-eUrg z8YN?dVN*fqWK>!QLUrS+sa_Z=52T(m!cf&Pjl6C0F6)13r2q&Jfq)j6;toT}bVF&U zp?s#HqRUX#W2osj*3CB8g8&e7?SQ$W$5=4MkXECQE!2diN_D}wR0X5BKyY@$^T7PN znQ(S-N|t_KykEl@AvM}!i>n6HGwWRTFqupaq42Mv5KI^d!#(I@_Du{e@#SnlECAu3 zALVd4u4~3ePBS{!60|?=`x`Vu_B4k&`4q5obhGK+9uSv*FOeszeiE}Ho zDqJiSDdbAC$(az}aNe9XdvDwJ@}7k^ZONNlflJVH3w;EQi#{OU3Rvy|(ViEe`ryew z1f2inOrsy(FEbpG>dElJ*pj*R#d907dMf&FTXf}zH{bj3NACUa{_DPaVDWR;wBEY0 z{k}^VzID%rAD>+Q#lD%3UYRz~B(rO2`Z0PTc3}y@_P_8L2;268_{%(wML#fwgo^%< z;W|04mlFmO^xm2kbo?n{XWDPY!6tE-RpPcw!kyA6mpnF9p5!6ZA{AM2%KT(?S%#)I zU)Nkl`Cq2k7W6t-42E2=D16(hnCmts-L)-s&yJLPuZp~25t$GUNr>a15Bk3wG-9D3 z7zA%~2Lj%~@4XO;;u?jnFv-?dVyw;*nzaymc3x2b-UG5J2+X3B7bSxN+zkWPi{|Q= zfCNSdwCey+DZ7)A=fB7lP6MIxk7h<8VvyXmwKa5g|Br93f(WGjv$E;=nj!pD)3QS-E zb7l-3M+koEMFqGJ63GyS7B@IVu4oBx#AL~0bHT<@=p&91flv&jfGUFFXMhy?Ho1`2 zekhnckYbvF0542R$uY`bXzo!#D?k(}bm9lMKJ=mV#~r-mTEFw@^jqm<)LJeWgrXmG zDo8yKgG{0rNP`~($!*f+HUs|)=)m>vR9)dzz(9&v7fks~edSDjRgbZDz+68EY~5^g zZNIsy$6VZQNUu|cXUHAVQiBVZs2~Ijcntq&GvUli@?NKlr7EWP z5jG%|m61@FBYgD1%0f6b2*l|`*nby-eb2=A1cDGI5=6i|;6GuClfd+4wa+HQp%T>p zdTo>lgw~4Ce~{OEORGUp1jS`aGNmvzCOh5{=@OG-phR((nD8Iy=_D5ZJP#PyyK#y&s=omnW0zj z$eh=zj}1ZPLY8=7qtOSTA5sDuA^hN4ZpYDk_|OMfjMjc=LFp|O{Xr5&1#Tj7Gf62x zRD@kEv}=XH|6&%0S;gUYX@pZ29W09rlP8Ch=~1ejcvW$#x-wf`U#M%TFwAH&4@|S4 z*W+3{H}t~A;g_$9xoLCay;r90zAj?(d5W}HL@pTzeSq(2W4wt19pFD5vkdw`P6PKq zgchx?Fu^^ySyz~Z>lA{(&qCu5_+0>u>eaG>B;$GQwu|T4E?J;IZ@OYig}S@mdHu?& zuMa)&-+%mh_{gWjN8cF!{`TQ728KV#{Kqq~Z|nXa6hBP)?7Mss1KnmpX0DVwRxFh;s3Rv_}$Z0<~1qkV9fhkp_lrrcexg0DY9zOcP zbH4D=N0qX=}VjCz1UGAStt6$YXK%b^cO4FW!rn(_Z{ajW7GGwcrVlns{@O}UZvBvDI zZJ#@5{dHZ7HpC{S$Q5z~9nCR!&WsgT6-N!;s_4LV)_i=C&sl zq$C!ks0=ERTr84H%KoYc=*P$O@pSC2uvX!GwXw;9|Sm-f~A8`QD#M$cjeTQ z%rYq-^3n7IIA0L87*$ifw|Ywcp(iQ-3*COJBCHz1t`#~Bq7W1Czj#3TizM19jSrC} zxSyh^$uFlssmmAvaOudtB3%i^v213^_@N8WXdF_VS+b)T}Ynyxhd~JCy zqLc<<Mt7XIB{K)l}`a7^qp8Y|LWGb;53iMU1)$oDwG@xGP-1&CEo zmZlre>#$xp$FgCze*QG=tR~CyuI&BS^?dZy?w|kh`tbMf4*&T4@OM}L?~}nF-Y)#~ z*_d}94}WLB=e?&rAHNX(+2ODcp0M0_k)pp%SeS;zgrMPeG~9tjxv;n}99UqY@!UkB zI9*svXMjwVEgDd4TA{k?BJCa5njXE^{P=Fup1W1c7K-w+5tC6s;Ai*`u>uUif^G7e zV%78(acTl2l}z+A3QS-EbC!(vr+CT~0}G`nsm1jUkt0eRk{}6BmB!@A;&SD2`SSRD zc|w7l)_&0IO9Ck*lUXSU*98OUM=_aFOld#301$vd$mDX?0>fsXvc0!71MwMNe6=s5 z0Z0w2{a^t|I=>Nyq95tC?AC$JpuvJdT^Cs(o2&9!_ zAhZjnLtn}$Kn#_=rkdI2x;bELhs?Eu=Gxij>RCqb!!qi%afKRpDrxl)at(|T;5sMJ zuywA_goBGywX8!0Mp2>7l~hzcudt%eZVOc?6ey0KDzOJ+d*R|iV4p38AJ9QP7hj$# zqXY5pcHsw%j5NhSqiiz%$NuDmW+}cuaw6If?-jZCBO{j3KXG}#kD@{enUq`IzxwJq z7wpI_t9ArC2oXlHjvycLK)BvHIWP6%Q7jDJ)JcL_#mLV}KiHTb{0KH;Vq1Vh|$?%dk^(AZF=Q7tB=Ql(sFH9HgH z>J|=OaA4QASN5)Y;QGqm$r_s$A)s>weF*$-eFy$oAA-?wAC&V23ZhR^Nv8s8eF}jI z#~q^<7NO=?XWi;)MROYxTl348x2`?3_3rQXKJ?!wZur;kWiMRYcGsq94_rR~&-Y(& z^r_ANernPC_Y|$|Rfbw{QUd!-E`F*HD)fV*AC&n8kqS{6LDLT&^bj%!@{#BRm|`g5 z2ci@sDlx1UAr$?zEaNdGX2-4pwk z`;C|%UJrTYVZ-I;OB#ytlt|QLN5bq(21tAuo)QHzKys3Zl1yP;k$7soc%VbNbco!v zN`2i{-L4x=2ky5#`NG!)R7LhAP;z^T6WyxZ4<#BWlD$PKE0))*$Eo4L>$pw57$cPYB3VM`M zMwl`l`k*$oLXk}AK)ko9-ZNDyD*6KmKL81-QjQjW@J%j^-h<8k@WGH8HFZD(5EZzs zq38#t0LkQBFuqJwP4*;BcB3wv1t7Uo^!ZbCc~h7&+@f}UQHQ<+RKVyfx{X!+fP2)< zHP;TB0R0#=R}a{$2OJf%90l!`^g3;LmQ?4$L~;nmsB5YK06Ax8!jZ)(S?|RyhT?!H zc(3ANOsTdfrMDE8_C$CR%|?q@EdD(VFQd^1AB=Dl#72zrSqHz(mT|SPxvAU(Mx0@8 zxx0R95b%GL{`Z4?8Lh`z48_c5n@}heQ2BxwDzt?}mrw2=T6b;x(2At2Y^7EKqZIBy zeCR_!(+}q4m;l5tb7PcWhE;1otR#aGa)9T+(}(b=2t4{zJ{p+#oHD%5T-ayN@yktR z1R-pPPeR*Kx zzn@)WLLDiP;sVO{0*So`{s4r|{h&Kvq^$5m4u}UXXV3@k6MhK!st+m> zM2slJh*AtIMX*YYs3oYH^1o<-`~x?77tjyftimlC!mc44TA>TH--^S`0Dy$sBvB4o ze6T#(O{PaFa^jT*X{yp}b#deH|0BSKu_GMQ>J937?Vv%M<2@o!H? zyt&W)#$%oj4~KvGTExHK41H_A>6#13js_wv26a1-Fe_()!4ksp)Mz{>fhbBB*5r#? ztHoWdvPA>rx@D^Eo3yuIYutB_`RRSeoi{25dxe>)kW6~U$v?cWJfuukmZKf)R5Vq= zT2)X$VicIb1m;u>s9qFGFr|Sohl(6glF&qHM7oR$1_2Btv4CDOv5-tCA`^>v0K|tr z`~pCdOB6|^illPZ`N9_9(sz?9>02eG08yn>F&(&RRb22Xy~=bp<%5A9RlH+=D#A0u z0Q8Z;cwtxo;@t*X2cpTM(Z?ih)+B9qqYfxQTJ*WC`n)N+yvf=;stcx|jrPBQ7MRkR z#)=+ORlm7rkfI;6y-Q_)%r;fcG8DBNbDH!?<@)G+(i$O@YY|LHDL?{q4$g#Ai&KO? z5F8gmRNkrgB2y$%hDPM(mG&m3lm)xoBuP@fhEq*HMhHTNIv)k~UFCzg6%>5~vrTB_nMjK%;6g8VI!6Bg%iG*SYh>X-kCgr!!+c;RUh<1IIIpf#MY#hp4VJ7zp-X*`}r?ky7Py<5C8n+y+1v1*(dkSd-j@+-P?Mf zyJg9Td)9sb#L|y;x7@xyqA_1+P(m``a}h`|NDKhTSoDKHqy!=(Pzr!xK>H!Y<$!yz z41|gSku#|vuy;xCiohzUrQ{!|T7qi4E5)=j%mAuyaRZ4N6_{CxTU5ABP1v=BQzvv8 zL?K3Tm`UumNFwdhSf?y8RGt<=X2y}Z$%>+MRYjh155C71QQ@ap~Vj8(JAF@m|M9`_Hy`u7`$YKXFGPI(n){O%f?wRNzjU>9QVE_E zfx7KTs18-^u@W2rHCb^=kDA*{$3POcWuY?aRKCfA;)yzBza%~u*8xXrkC zm;S~pB$KL9hZO*jGepVbeYsJ{#mTYio+*mvD%|Y~=sf}xn82LUq4QB;2qR!Ii7Irs z&Q4gu#KE!Bh%{Mrwk(d0LM`+ztplOfuL6eM5;DoVrDReWNmsxmmy=8Y2pa19k-17+lvriKgi;7b0}7CHY$lvqoI3geG9_u-3x>%X5K8vgFx;UAwH{`Rur zPo@pOm-Xp0G4DU_e*1v?y=Oe1y&U<|J7FI^W8ASxIWSF>pN2)cP`3>Yv!Nc!0s{a@ z1eO+qXC(j&Ol_ffa<#a3s&r95xo(Ma`-R#&t}{G%yY{LrvhHcZ>~vVKoA>|_@5`=4 zL_~%tS}N5uCJW;tydR~Bd_I8*Okn;11DxK31SK_u-YK$2NWv0jk(sjSYNWiP=Mq%>2rY#Mn}s(Xaxwcz)Uxk&NP(w8Y}t%0I3=PIjFV$ zGytI#Aib8d8Rp!{*0ef(WG-p(2xVFrC_v5(ejb=pF%ym~PSv6aDwW7!7@>X>g~^rX zn8d2$n!%*hQiH*aV8{g1k1=@&OEb7^kRW)B&j{PJ8|0_rV7qPwT=MED&_QQ_fV=)` z5FY@6A*ozuwpei-rxQOUq$Vo0plk6Z18XmDm_ExD5{%)9AGkoqTJAh`9W6lp--?d) zc-T)CBJib%jJ0DrUtr#uF-$RIU-WR@G5&uLV)Y*6$@4V{L7am-@_lD|$Hb->u=_`CW9q41U z;U#D+`T_AIAA&JzUr;EB*)z26mR|4kmm8H)WywWz>dTk5PTD+k>Ej!3|N5bQKR>(Y z=Vx#H=8;9u-_ZHswi)|(EdFTE`QIO0`}M)8ySK!)m&-#;0DX)yyimCxU|}iF2tU}x zSosGC&144IptEJ{EZZI(RJg?O(( z1Ki_e$NRCAi6v=K>gm<`d2NcSY|Nq+@HGtH@01b|?ljAbQnj-hjmx`?%X{?mJG4Ws zrV9pA58g2SFOOgI)8F13{^6bBBhL+gvt{^`?w{W){NixrUk?KL$ESxu0q$ong}ial zy6YO{oK8u34i*!Ngj!MWdVm51iwOZ1n6y|tJCP_z7gkd(FkP+EdA;(r=P9?Y)7*N6 z?#}BpS6oca8xR%bq7IutNKDL!O8|71xZ6cGR%rUBij!jn0qzl)zy#(r4*0ni7a|e` zrqJVhyU^+uhr~-gDYB?6kO~5fFhzcw#L*8b1T~pafGFrqF697-(nmkI<6A6RjEO$j)nwFbG8!~M0nz|mFj);+?`Ah>b0`-Kr2qjIm;%rR zqtB;9Pyqljmh~Dd`V1Ab3>E!`>RA*68L-q1TI+`FbwjrDUQ6LrQ+lm7B1>hD5vxon zA)yo?fjR4E!jZ+PS{U;F04pJIAq53sp-ABjO)INgm|HLT9j1X&0&XUHNb2sjo zz2?%CtQ?tK$^>^H0v`Gh@OX&8k8;rHgImP^E_;##APhG^=@bzrQDj8&#z`-IF?6Cl z#CKK1%Sz>73w^*ws={=Jsvi;&jM`&`oze#)g~S!*%Bsqa%}y|fTICuAsn@9OHfM5D z<($5?kKDTb^}S2)+E&xwW{Ys1rpVLN=XMD?F~bWqR`4l2wg_aRDaSGC2MS4aWN=1A z(Y%K8WmC$RwGQlBe#1ZR+xzn~`~G+6hOZx4`RXm5ySGh$Qd=Bjj&RR@bES`2U&j`zb0OGTpCP|eI5{p@D4G85IQ1Y>$P1V90TyG*jYWbMp) z^SS}^`T^a7cJet9NYE-g33($}NiX=7=kb5sOIxQ2*)tcnJgqjybGkL%FKERaTY@ zlhUBTuMh(hn7~ZPc)uedD1-}Pi5zsqXl){^N9>A~dQxREIb{3@22w0%07$7ksYFg4 zD46vFARGpvvQI0h{uj^%!!VE(dTAr`LyshLWTLd_5qjNJ>T|=FD7t(c-PQl}&23IUPa~0r_G}`34r=EvNlJ{ly;W zSm=XZDmjE|RN>GE-!H?2Y=DQ2{1?aNArSBOr0EC8Kt{tg0q2eJsX?HT|E`}4h6g?P zNCZM*i9#Bi6_;6&9UA9W7}RpTT4~Z7J)tqBh3yxv-1PL_TmN+5qMNpqPOq2iN%%C- zkJF_3@GZ~qaxB}+*yw{!J*7);&v5hs=m!oH3UP2&Wd1-+*^V6WX`-EoLVP^>LD2LAW#|WS zZ1f=n(1YO~6#Ae%FI3?RBm6*V^a1FHlq!EAaU+SDNz9_atV)W0=m>{i=+sl`A7-%! zq<=_aoU*tOd6HY62K+B%Ub3<@OH*5@YpF0yZ!q<>n&(ZoFY9-$o9A3N*VH#z92*Lg z;*(Z=Kx*B^Z&>7%E@-#*}e`=IBO!{J}N?)mt|kk|H^cWjoo)nKt9 zNQfB;Hlbla0fI#aW6_~lJQaeP9ZwXc39Ir%jpdS=Ez)^C@>L5JTQ{h$-=@9sO7#^N z%LclH`8kkAbJ{-j0t7~lT6tBGdUl7rwivY-&y?(uzyu~Rf9L_JAOaMFaS;N7LG*;t zC3ZzgJt^{-Y`{Pg3dzJ`O8WumhdhbHASDd_@SzW$1;$r{Th7$rGU%g1!DvE&0z}1> z!f-B_>X9+04C@%N&i1%T8I+UkaEH3Qc29!t?QQ(CP)I#2D0m1^v`n1m>o!9;%s1M_QU!g<9h zTspLpdB0#(BGbjC*5{XYr=^u!O;(XeL=|(eaiF8o2geqmGr$@%s_0fQBEOX58zVwCc?VQ! zuV0JqNI?k2wdhYM{cJHvZB}PhWu=#AxMD(8CY{Ql)7s4D$ncbgn(l2Iw!OOdqGxsu zUUj}FElQ#kL%(1l%=C}(&XC+K4=41&TuBg{w)a>m+Tz@h?7CbT7mJ_l8%meCR(h4Mh7WemI&f9necSq9y?w>!k8U{nRR62D7OtOV$%sbe z$Jc&P{ug=)a4VyCr0N5aGs~e5SVgT`%+U`-!!i(!6w}k?FO2yGwQxx$BpI{&o1r zmxjOJHT>n$pZ{9<&C9VLJ>`Dw5%*h9cs~4-=c_k7pS@&%>@Mxv1(MP%EW(L6jX(hs zVnxDiXt)an78nm`!p(}u^OK2+9ARUbsJ&4#I8(NAzT%=as%tLM+;o-tiY>BP-LO`3 zI#Nbq2vIA=nTeXg>GFnh+-W;=TXzE!n85sThw90NQHb#VoS?)tW}!J$j5za%o~gQPdPjKUyP8Y(zu0Z1xyt4yw>mI*}lp7dE`SYHeq0Kx%~YQKh; zv7iT?_yM3tCN24(4l?U`TSr-7>b(mrFq8s>s==k?A9*dH2&Q0)u5hZpXu7_*Q(xMp zFYVTs_87~0O_hD7>V9)gzl8}w9duOn+e$jknGNdj4AK@UB=w*P7YT%*o_#anyyDa@ zh7w{iC@2KN4?^k;OV2Ls%q^S};tV6@as)wuet?U=;9(F(Bmwz6DT1*yA;(M>9nCJr zRd<~1a^ela2y{ao^JN}ECq_befgu6}hE*z6Qc|*1Dh2VUFd~#FLZj1K`&Ta6dTZOP zg|UfAIF9+bJP@j;*1sHV_#QwJ4*|wuMpwXAU;!!_XCK-jtECad1icGlF4b+ z81*WnPV2HclM=GqnwRXlcIykf*Y3NaVP2;rCKMB)Cqyui6L`#-rTPdOmH06x5`lQ> zAN&9iw(|u$qdQ-`i%M{9m?^!ZqOBKm?+c{st@m75lS-lj`syagyX?xRa3EUc8j7W2T?1$uOBD(H{d9uRZ7xhRP9yf z4YSRg=joSsDQDEGW;HptEGXQ6{pR6Mo*n-7{ox-E4}W*Z@IP1n_rua}UXFNgzx%aE z!rnaS{`heCSFcC>iM5e^lCc+pjcE!qKa>>MEMN+XMv6NmGeNfAi5Fh%W zn{ZR88eEEaaDou!$gN~zKvJt%|4S7W{ZY*ZfYgj29(3Cak9gEkZ7)9VLB*fe^UgC# zAUXg*n)SIYjQ=ICMVsHkSYV1e^u;suC0&M+9z$t203a28=IUAIS^z+-wL_Mg0c+JP zOTkoIcC$69LK~bc(>Y-z@Ll~Zn+b;%r*=^U#W5?^kx8F5q?WF}(wPveDBoeaM^-L=0I9Z?+`d|SF z!sP!mqn!gddFd13A;_2P{O?EUwr64&t3hGJ-rWKKJ~tBosV9-rA#3ZoXSyewVY)1YcB!tExY zxA|2A5jbYjN;Bg$eNCoy1BR8|+C`n}z9#ixYwRtXI$qs#>Hj`H{L43Q4Ig=a_`4g2 zKOZ>qPVqkuMg4id=dH&*e|aY2vsc2uek1HJPuln1rW~3sE=a@Nb|C)0!-&YUdHOoYUupa63VOke_YHVxH?fa0)7hA9n%IYbf?Cy&mN$L5pqtP~{C$34ho zIs=66f}zj{y#RWYQ9Bm;pdvw3sSE(2LQt#JY1L}_)|Y@<=Wlzd=gBA*hpdbPX<*fC_Gb4y08N07$#OsKZb+!%*C1DCshm_L$0h&6U08nm#iXf(k4! zb%XZmep_j$Iip_XPL*5337Lknzyv~2&yJa3SaDK?g(q_*O8sv|B%~oSzPxJE;<$u7 zApDTYXjcm);00fBF&gZxAIjiWrLYh46NmUc(jP~ho-7fXa`<2i?}^c1=R_Pa2!be; zDpzoboFu6(ER>MQ?e5r~m6tBN?6#)vq1dEEjaH4K2+VR1ANoK>+Flqz2r`O?aEr3J zsiQ>;6eOWNECOCm$k>4)vAzxiN>vUbLe4q#!7q6kKlg(VKt>nA__9yWaQXq^u-auvZq2V+(_VC5bLIKdmOp*T zgGZly{O1?Ed(CHi<~(_A+s-XBp4hSY(?`}GeRAR7AE>*2WoUJl(4d5+fk=hk z1?WRMqTH4`ApIAh4>3@E@bn(O&KDKcd#jORS}Crhf=`Vk2DBdv%%a3>6acYnaHp1V z>4;#XFw86pw@~I6r!+o9p6HgRMUa`%iu@#1d4{^aK+{~Nn^vvwo@AIk#k8Q)(AOf* zO-595p7!I^qYv-LLF%@c%2R@;m1t7KF;WuX9w$2j6s2D^5uHj}kgV;Uq^!#$f-NWL zb2;|k3&;R!(#i@`^^4jqTNfG6A5agrDreLimv_bAf7$#`4(%9?^J>+cE>Ttj=C&bD0}^aR!_271 z3KSqQp;&?kOO3)ZWAVHsyfj0?0`Kf8 z8t=ykG3n%W*ekO#i@0uz|PoWnnYiO*Gz7F z$R#~EbzTiUJ0S7b9aVd-Bb~|AD3bp`re*ae;(FjldKSY8429G?gWY87mYJG3;EVLW@xR8%{}P`mrtK z=f}oC%kNCLl70z7BT|S9Ow%c5NG(J$S3qwrN@f7%P*eIdCTxpuSh^ql?|8itPVwfI zd{_XGqZ}X3s!3F-5Au8Q54jSuWm~+vkJ&I41KOl&b)>T+Bd5)cyZRsBtPxN=ktD@_ zJCahH47alQlI|#pmC&pDeS^NqhCh?x_MQ2ZIooQx9r-N`a2g05q!g0q5quyhngC2dPAl_pu=tk0mD z#A-=(k)v(+F(RH*@TYxeWO^o3MJ&2N|CmCCB{?`&B`8+ce==<=zN)8;k!6$totI+e zAF`xgdnZespSS*>+m;YX#k^CS?8S8bVDxi5#aHJ|? zxXJmREnQub86SRmMu`-!?ITlEw&)|BmAX1WB4$1K?K?at!lspTn zkuc)MCx?^gR5my>0?ueKaDis)DV|NG?&LW2|1eZg_Vhvv0=|u5m(!1>l5~{GOnzY#l%$M2J zhQFDOdkvgVU?whd4v``va}|cHd0_BKw=xL2we(WUbmu7Q>4z9b`c{qpJN9z@+UE{K z4zNY1E9Z!uGELr*@b>BupiYpJdcZful0CGL=qTf|OpBoBs-J}@xDa0VkOY$rtF4Fkw4Qk-O?lL3c%OjElV>tC{ z!QT~xLP1NG+(r&ux2o6kI3d1h!lf!NtK_7I7L}Sq^NKZPffwifZO(@lDo!LIFhC>@ zFE0~ch9_#x9wV|7194Nmg0i>4+Es^d91ZWEp%va2YeorgHS_E_8uXo1iVDa9bci)g z-=&kxmOigLy5~^CzrjB(P+@C3>G!ns=eQW>lXW}=y205aEZ~naqq=Y279=6$1 zB>Vo-R()SNIr)$eVj0F1DT}R&yjn?``osg6Dff4Fh51Yit+^6TpBR^!*2nqp%QhIa z=>6moc-xd8+};*^o3#`U)Oi^^t1KXi_Ok2!R|{tGcH?;;TtqS(y9zx71>Cv(IiM%! z1)?;oAfiK=2S+&-&68P&5X#5*EtubIP!>~0{Gh{bS&sSYE`y6UvC6Dz@GIS*Q)A^% zd|0>$@TMLPtk0pMMn5j6Hf^n?VBdG1zGzqh*4Y7LeHCASAi;tO6-mfxmCm(>2a(C4 zRFmXQ2aPZ;g|KvBEv4}TpfLtACe%Qd@$*`O9HKt}x!5Y&gx93P1*Q76h6wO;E^gW3#5meCu2z(`Z;*tXaFx4}$2CzvQvuGO6nbMwv4=Fj) zJ@6+xXaNi6btg~|r0(J?9iny@-+VQDyDiF_OtQ(!RZJ7oe=yK8h3~3glps%4W+KpF z_l}y;hN~2HqK8IP*?L+SDNf#=ca1d6IXU@HTLj;>MFgq)v*>&eCWH+4oukK?VPHQ( z#LI%4mDmSU+Kb2`A@p@8F_Keu@o1i;rP@t+=w#3d^CpVWh(kbR5=Zi%hW7Fl%6Q71{_ApQ=E6I=T0P>$GzT$7PGXVwN; z{`u63yZnl<`)b(B)OoOFz7yt+)4WCZn@fCdl`#0|T%MTa%2GLaw=)f@N@sa9w)-3Q|6u1~rdN8T>P?bJ-u#4ID_u9XvQAQ2CJH1Z& z8s6LO{2aq8{K>gL%1yrIJMjJr@x(vtCFHYw_lGcF8I3=`L%+M!SS=mpjXD1F>y^Mx z$&ba)f|I5u{`JXkj(@VZ!19qvp-S*Y;=t^}kl*~mv;1dt$GS6j0uKzHT-T+vI2tM{ z67!39_vghQ%luR?SDq7>-w;C}MK>eOxg6l`g`Y%NBZfM!-5_%0fEk3 z4Yn~vT8LcuR@@@9U?e?#p2(C220&#tX56p!frxR#KQYa6h^@N2W2rAqAOjgLrj)Dm}2rVV2YNYj_-JRgyn(r12! zJ|7$j`_pNI3>CP+VVSu9(J`a@FTYlb`HmMJBND!k$TYP35XL@g6{?&WGB(Yz0b@(?#tjv!&7r6V<7ble92E>xV@HRJt&hhz> zi+~%s#|&4F)w=BM*0PgRgs=`i|1K}K1zY$3;aPH8OLUkVYyD%mk82LxQCMX+sqSiL1-nfRQ3%D8~`uBf57; z{d1(xsj5I~Dl4-^VFp{G!UUBw*@|H3LE~7`e@l*OFy}v^Y4Xm?7yWK)3dw~fb(4$g zrWQG{?DQv^^Oiew6<>L4vt>1b2`J@M^PkS6bx)+M3xyo3R=!_XJE_xT?&6zQui!bYEcY4;&Y^j;nX8iJlfhch4}hR=I+g~#GEF8wJ#H-iq1efPHXr`{ ze7~#Qoqa+JY_@xzj0hLj<$IgWc6==B`e+M$GXHp2hW)s6+2j5P^%>Crez2V>zcN8E z5vjqP7|5fG6gvvdz=EK}Ku03~u$u)Tz??<93l=_2rkh^yRzI=4OZ{7;n%An;=+;wO z4s6aML-4*oC;!F1>uUSg-40iwj4h=PI`=mwi&kUwa(#WDHo8cZE)vJ~#2Od{M} zS|#?xJy^r7mY!Wf_*4>^GDJus^1I_SPc6!sh!^YvIJ`r+{EOx!?UN$WM0lwYkV_Z) zxH>UR(8Zl;)HkL9uxw#;NbcM*qUG0!i4!E|oYjCz2t;)CK?B!C0SDN+I22L$UuYd` zumZK;TNWx`m*m|22+FvMfpoEjjmU}WrPM?!xsj-Oj49Aj<~&$%MYLqvSoVasv}blMO|+|0UfaK z3HMJ#2Br?+1t`C5A=I)0)z92w=P8RyS&;WbB`Vn~aF^@bo{tupHaXfID>qLPWhhM* zoQt2O4}eix;Sy%zLuZksl&7{EW7UxFk?_LM(h8Z5BIFec5||-UUqnI$H0R(0@gL{= ziUlds@joiZO%qx3o8b|^a6})xrPf3f8A}z<+b{AnNF^+$r5UZU+xK&3Y+Ronp{!q? z_Flf-SNT=y`MjNsN~kB543f_2AgP+yfDoZD9YxJCm3XB%sZH>4e3O4ICGF4V=<0S_ zxlH4$<7|4oJ~+NP|9k3e@ozo*aBMOD*y@&VG2XsAUXC$pd!PCgaCyYl$GLbB|I_Xt zUxl2kN_ro;+ro34gz5Ow$efD-OQI+Ycuh1xMEsTM6(sLb1k5u26%?@JL%>ZN^!WXu zw*i9m{2Dh02ksV4kmi$gQ)}&52~;$;yajs))uH5%O-R*b5LR#~ z2?zOB`L}v5h8)H(Gg8e}nOhY9%bM0cd_>41JOvpQ2PrV6LH3uhcD_c90wdhZ58Y;R z3I&Ug80w|=y{<)8pQT5fo;zq<;b@2r(vAeokyJ<3AdF(sl$y@mL5f+4{T+d(Qk-B z6qI6+U@Wt&^GXP2EyfEk%nVJ=A^Nb1ndRH(4%G8HD$9a_A;`lSR>^Fw4mFjuxRvMV z=MmL_M)b89LJIJkYTHX}Y!$~7et~(`Rhd87xIPi42kXA07e-5IfDAI}Lu1d!z6+ny z|2zDB5yAl7ZxW}Pmzk5Rn!i7-z~P(67cqQ%=XL9fRN-0hbX?%*XLH;O~95oa&9LOngB-13jiEtQewOh4u&E^8cJ6mVW z-+Xu5vo7T81Wq20fZl(O+gEQFaA*vFocCkl>I|MY?7s%Q9ltuZFbG~(l%K8so>*{V zoL)o|5rDqzw=ep`SXAE5XmZcUf8)XNiay0G_6k>C>Qts70ulf~)B;C(jxGCMiZk|o zU`9frM0749G{t}a>idK|03l}v5YDQQU>=$;3WuPw0Jt~5%vvo9%dszE|2bU~bGOTC z>D1$IR$9~`SB#H%*+?)K2cgHS;M6t>Y_d0vsHM@FE~&)&z8!~Ij{!sSK?&bqIPm%H}UEBTB0C`97ruD>(=^?SiNlHbqOPS5I-a1=Lb;`{^2JgFg56Kv8D z80uq4#6%9}{4|k+3Lw=V3r(_RJw-*kwCNls<93yHk9M#oR(0+|BwGjQZ$^}6jTv^ev59C1MR+Q?3rZcQ>=a2QjbV~bsR9(cnMN0GxMq+= z)A4sWQWS(9iWA0R8}cV0(F*~lRX$k+0FkK&|D*8s^zyKkbgIV{2;Z~968pI=t{q!^ zrxivPT(@Jj3C=o>%8`&H4zDLrbyRf}IE~8xG?}JSz|hjOWN~QO9%E(v0!Ea3 zHeaT8Gf0HH&d?%Ai2ZKE@t=%&zn+aWe|q1)UA5Nwe16D!=I-0fWax25hDd@qn08P@ zs7MAh3H~k$A3&4Ss1RftOD&+4S;N+;4HTgn47aF72OpyuAp*-mnfW++@%RUs`PjkW zPutLV0@^shr8x_9W=&m}@SY<5;IPi1=Ch=`aVu9&N-3lTUmIEcsB&3Gk<5;lv-hkm zFA0%zqp*F&8|g8DSHMVBbhMjEC{UfoqM~SY3oB47YPCefH%zWG-muqMQ+y>x4_4mb z#)OlnN|s3QQERrj@H-3FEO-6q{=G?~X&w3Nl0Ajatb2}10u`i) zn!lG;(3mWF4Ey-0SXE_6_5$Tuj@Z+zW^SXwR;f~=Z zj_$n7Y2>2D&`+KJCK`hJ-+mgg2jz!yQzUBzwK7av<(gGLMd%~>DwG(DLEj=QNf?ug zTD>lp>i;t~9@HI2h2^DRVY~$UO@hV1v(`jSnAVNUMOa6j|SU>C7#E*^@W|~@P zT}@MIGqSLpvE6YzHHkP;&B2ETsjb71&~n#)Aa(U-Fy6Lm~Z z70-AT%Xn7}l(1^Hb~pyE3^0ZA-~(y@va2-yD$uh^X$Tb z>rW^N=Y{0)^^iV}e?#GS_a2jTsZe=w&F?3zndu{L9D(C(=nk)p4r)LvY*W<~E=HTh zq{sgz9+EL(olm60RR%&4#%^K%wFnp0Neu3TQbA`g=e2dC_R3)s!dpO)8oUoVM2u1|Kwi+b#iOW1pTJMZqg zc^w7uy}V-rx3xa||Gr=K9QgkAUXA~kg<^N8P7viLY|CAUD!6CDf*SPf1qi9|ii#yo z%2B|vl&wOdn%30tOmTa(@KI&%wnp9LkE0zEl}5Hl=nhy=ldUptb?WfZ>ZBAz*dXvl z9RX)e^m0;6N(ew5IX;n1qlhBTq4Ep9N#YQ>rcW7PwN##Z#cr~Q7hr)FfF2xheHw3N zbOKSwg`i!MBQJi)w-;twMrs0Jx(Z~C)CBGP%%M9mlk4;X40v)^LuC=n08Ht>=2X8< zak_$!E(#p&^(^d+%-{ePiEyOTP>kc~~c{B#jw}vFL^AT21Ity9w00c!M zI{QE{2J+w(j%(Mbe6q!{Ebw($gYcW=Lkb-8hS$o~WsU6_mu?MhG$Ikj6v~e31ftFu z0}3-KD+$IX7Bw)^tFa&{$0=Me4?i*%=Q>r0&|ce1yBP8q zUaGhZ(rzMrU{oX^5+F{BrN(+XFj5>{cN!c0t!cHNhaqe9eznW~k@Z?AQB ztMz{EPHm!TeC~ze<4gqfo3&C@0tq0pM=kX)STr(}G}T3cE{qO2lPBQ#L9r^8YT1&z zK$t(!!GAvaNZx4k`S&WnC-GM2`*qCf$G?xV^}4)|oirrlF8_;)9OmckmgWNc%Z@t% zPk)@cG%#U7`p?l6Gp({P&u&ESY5?iCQ@XQ21b$-~ApoVoUD#b$Ar^D7{u}@prY{EgwJHkVPCYb|iQA*NwNxiN8iNr&PY_ubS0d9@vTJRaV z!WD74OH|C00HF-^lbcW*Ijux99ic&=Vfw@%pA~_QcDc<}(_Ux)_X>V)|GSx(LE|32 zw?p;8h)cYWAD+i1Gs3MjJ-_}u4Oneg^Fx8I6ki|Xc8dJtr#)?7|6T!Y8*^TF9d68p^b2sHy8)bgQ3yct>+iTCjJ{d*NdF_)Gj& zMujJ8B}l8)oQf9eU_euy!+huYudGBb&$gIgCC!DdP`g$*d*EqGHD|{`&mSxysiCvH zYgxEN4do)58)t_x?h@-zC^$4RWyFcanV@Sy4-lFL!4Ii$L?O6C2f0Dqs}2+;umB)3 zU_a>Xg6Rru7_L|~r@6GBvh8?a#sqMJ?$`BRd68nP{llu=S(@z(3muXeOO*B%GHe)F zqQA38tDlrTW*A~B(I^?1(@M!7@`QgsXU$!}7ofuSZ+hjj_^L_mh3Q1}eI$F(CHmpF za}7BOxzY7clz7L64D*lAa8X1`9h*=XqITIbwO1(7@BQ%C7|393)R~4uN#E!43Zw%b zSU79*T+)EMC!=_b2aXcXXsQ(RdP%C@#7R)Yby*aNiIEKwZ9d2y7_7(eAR!}`F}y4? zu~Qo!KJ2|P^5RVOBq2((XpBS|Xz&0BHDZ!7nW~#)xMXlT4xhbu;S=#E9qStVC}TRm z=dnk4!)@oLI=?q?r^6NMWgJ)rEmX9YpbqU%l!HO-6Q>k(3N>I7N{!H*tFiz;oId~> zp42<`#Gq;rahLKA)W6wF4+)!&x#BxZxDtK_cU>MN0WX*J1p-ff1-_up4#&~*v@0Q} znZVZkhvg&h*>4Kjnzi>?D%ebOXyAbaPYmf8EZd@b3@#TzoGRaAmjZU^5w*X|&s;+m zM(o5xO#DYsolqgRW^fxX3v?PlgPlW5E&*ww6oRyfZ5CZmK*?SdhpcklICO;|58Yz% z^u6LmL2&Dp4{p6=w9?C}PhB(>hfiBvbhQAB)ucc|{tYN`mNJdJqv!&y-Anq_(jf{O zMzB+`Zc*=>8baFXvO*mzQy#;lyx76dsE>T`>ug3=J;uq9W7GaE>!et8(8g6`F{fF+ z0>-i3>s4Q$JK*K0Wq0-wIq>HGx@bLIi0JvW`DdVT#@h($=N65?zx>;t=Fz}ok)69$ z;)D-f&lMLNMY5wN2$)F4S)~C^Q<5)7o;wh@`FII5{~~{pCgq9YSjy2OQ9f8E%Rc+;MDxiSf-+_@?!kiWfNDPe?A#Vs08qyvuq%s4NOOeAz<0(=Hve2f? zpZn2At(ho(`C;hMKf+1)F}E1lL4#gc3WO#udW|&dGq<59=MSa%Ej2DSlAI(lL^e+f zgP#%?dCq0tVG}PSTAU=qqvKu!x|3l{j}+N!WRtNlQW!$|F5x1^qZgvuCV0%?z&J@e z>rCl`tQ0f;*R7PAMpM(RPT&1y#@Es7qESA-&Hwh~4$4~=TJf!8ZWN7PMCvLiPh%ZP zqA)X;++9vgu|y4WB`8MOVm&c5CI>+HG*uE+ay zfcxX;K_%f|fp(i0{y@X0!=q-fUtrUI_M2u(^Ej6VZ%Dv3K!T+gp6mzF`wjs9%V%Vy zNa&I}!xF<&AK(lyy(QtYhNeL!2^JRapA>e>eH5Ru6Xtm}RZFtMwwX`Fi4QoI;U9ZX zY>U(Ain`6B>kUKHvqbRF{Rz&G^oo~*EC@-5kYY+r)vU^z$z=}g$)7-{YEzE)ASdY6 zG0qbqPwmR4G8JsMLf~Em=#NgEaf5~!ED^Z840fSgp~_Ib9huln=4 zyKDJrh3RwjA7nw-k@tnoIutjZZ$)A|UFIk(P=y$FYTU$u9Y89C6GZ8CZ2`(Bp>zQN z$f|Ft6fKuZVNYrtOoDY;^!ePA&3rl?P8gOCsF!|3H0TUT|2MthHS9Hkd9%>Fa{tGM2kyBiv%H+ zYZ?OvM39S^&RMYB;mOf)f>Pa(PC%PdET1q8$Yq8#kQP5xkwxfz6*XNM`XJe7)r7Yf z+UC}}hGxEqq_?l7^XH^LXJ_zESYb&AIs&ay?x4F-(@~+Noc3H#>j;fZZ1s@xSkIRxiROKGQ(sIL;va-3rn2T z-)2T8jb{_PkP<37+9qQ`Bt5Izg6>Bk3m?1(4y-M9c;RsSWI@g0|d0g%clwWBmEzEC=Yy8`R$A1Qyd%d31B6f>DYR9ajpX!gaP{7}7zf;j>0?lP+~wiyncfPx%DvqjP< z%gI$+FtA&b4m3e>=&!-nlK0;|dnAswApat<^hTaUmzcMZaDQ25w zP_-XxBnW^pt(!?C;6YjCMAbJ-cc#38*qml`Nr^eQcoW+!A^x392G?fX$tga(gl^?$ zS(shC-IgDn^vHK>nsJhmVz7BXHz*8PkiXbek!lKd_cxT!`t2fGU65Z4RIW*;Fly(f zKm8s7gIO;3#*%@%$2Tg822-O{AXBGS~X53 z&TM(K3u$(|xY_*se^tQDeSrRcFElB0L4+VTm6J4PHjxI4UVTF2WI4M=Pf@9aD;av= z)j;PJBkCCdi3aiADep@MmLBNzO{--cIZOax8po1{frLEC2WIOppcxUFG3*1zkj-Bh z)Fl(zt5yv*zgC`LvWeiVWoP`v`EL>W3z;uFgU9xWPp(3rjqulvu1kt^F$-xQjO#=% z;-`S!z{wDT6bLVTx9CZ_Xd4TQ%JNswua0`xSKdQQL#`Cb%EUo{(@+#xKt4GUgI|GT zG@qWO^(=yMK!lHts}PhmFlZ;>qmCy*T;e+b)8a`i9jqw9?0!T z9V@ACprjdAu~-b8PziaVVh7+II*%>e65)rW-r!aQ&Mh*vr$yYW~+H%&LLk^j1XR(|~`q!ygr{X4N9?+#h3$#?Y@py2N7$ zif=(Icx5c11G0G`Y_>Apz+*vpEV19hpix>AXtgiE*79~FAG<20vnrj%P2a_dv+cIK z@hfAm-RmBjp1|F3WfI+%v+|zWUgKZ?63$TVjh-HkG#$6q1Nz1EZ4k%jROg_a60WZ^ zR2gX`+ChG=aK)tPRI8N5C%4|x|uVlAADd;$wzgc}tCAOMus8B}~HSh#to_c96KReCuavg{3bRd2;IlKN_)MI{Jve^5%T3Y{D@%fMU zv*%(O1 zlG!d8j6*GqPYB5RSC)2b@tG&PSyhy_qbe(l+T(x$g;?$X7xE!r+=@fUfcSED@NrRW z!}6PzwwxNQtfz-ugUo(n!Z$6wN|t0CazdNs%DjaP9#- zIqDlJJR#W99ODc(0{M>Eb36lceDF>%(-M*?(@5UEpe!ARG!Cg&G3J6%o~RZoe#LU8 z#qx5+^756cWdT2ZgNwRI!}MO}Ko6_pw`oBmUq0uq+uqP38kV@I3L$a{CEXKMs@n`t zZ>@hjvyiog0_~SK^zgNjn-b*#eP|WHj5rJcGLDoi_X|?|KVHfRqO6G6-LRxdn}kvG zR(^Db`w!qSm0A<~Z#Gwx>Cer8HOm|V8b#;f&H%R8XIWxJ87XF|O9m>% zooPZeA&+79KwY1U_AE{q7e-=nkZCp2nE9^sc1QuFLdVD-A=8cTg|cgfiLCUMlFFxG zn=vu3<4;1^UM1lc76b>xHP>>@rF`DzZsx_4%yFxEmo{{yiY`1rKYBbP@J$VT^?T4umpX74wjXdA+%#PW zaZjqk*&ijM(hu{!iuW!C3kj}3ih;$&B-k``oS6YY#=rn*Z0fHtxvUK){2;%{E(Pm% zBvP$e%A(r*l+Qj*wtPMA0vM)JGAow20x55BH0a8{`G|`aw+k4aH1D|3Vg1uNsK5>_ z4qdFVrDd6NRM)WBm10Dvdp}2%RLRShd#GNcNBQEb@Ry0RPQTQUL$cK`{e8{7d3LL5 zFNgbs=WTvwS6mr6Fktd}^eb}r>h(!ajc5K{_gkpvwt7#i@onJG?WY_0M@G+_K-XXw zml(<~2(ARGF{sV>ES(sxE;x8xaGX0M$%0-|VDyzbnl18{=x3e8f|0zUO<9LNRot?d z1GO!?I8b&&`FS(pe@hA-VteOG((_z{g`HHsWNXKAwnmjSt;+G5MGNlmh_1+3M*EFK z+#t@-=7unPupx*UX%}($AnEG>mmps3WThw{@;8#m#@#moUy#_ zG{ADpgcSggZty4(bKnW3(ZkglSPqUW;dva@t2L~uu_ssyBu6$T9l21p;D?C zXV-hk*=s50(+HYGw-R_XZlXY_gEf+Fz#YF=E-0XemLlcOQ-K={H2*dN;%|3_$dLWo@-V)rRHM~ z9}KF<=r?vQqP1G8B8DhuD_&9ZqyB>~aDEQVt@!4bezMCJ)?fGi-XE$)4_Y=<7|LOvX z#E>bm=Qb+WRZ2M78G6NpD(WEW8J(H2WpB^&0H0t z8S9jC+}I@vGG{LimJcL5YAjEVMQI-t(1I+{ znu6hn5P3$)NrcmRW-bK5Sz;6zb*G9ZM+`HlT{NMDFc43j!YR;M<$Ws70U0^ZH=`IX zzKMQ5iMz=b6%f>*H@p8M0EE&3{>|&P|wnoWI%=^vP z%2>uhA+$W&R%_MEFT^j{S!?qc-c;{(v_)v_dl1`MXKTPSeBMeNxIQUSf`&)P*%)Rl z?MB>H{C#sk6b;{9f zkG6)xPMro@v+k7s)UnoxzwDFw>-N8!BSGEB%fq>183P+>&e)F$^ z-R=)?Xr9~tHhZxIm4<_;-NPmhGn1Jc-=~EnEl5vN%Rn1_xJBNt{p{$e_7W%rno)Cb znUEC2;9Ce09@t_GGZ8lqEA(HW!n8J3$xMw>&ZVGWbW~ypK%^*eRz?62q$2d?u=N(1 z@(-P2T!!WIac-f2u&QRVS=FQ}6`yLf08_$6eLE@gFr$y8WV&-eXGd9R17RQnFLqG| zV>G3Jhqq#|=?lYT`0^1_I{wPkBI*=J{%V2SUq`E+?)|sV?r#6%IoCmB2a=Dsj$Jh0 zUjL@+L0rtOwG)5u&Z|DxsL!pOxA8LsxB~aj_u1FOn92=}DF=~hy`^I5T4a@=Hipdg z=n&a9BEZdFA7qLGmIXRCAV@~f_6HrKh9~YaPQbyh z#fXhR{CMcAVRzq|7x7JkPgpg<2d8CL@ntQu6M7~(Fk?XUkhPyve>$eN+J=@JhK#rt zGmR>44#)AhnKVghaR?#qFzvt(xa@HQrhuD}tc-<&alm9Lr~PI%W(dAq85{YF2zh!s z_}%6Te;_fc-&P6X;fBejw(C<~;8^61U}|;RP+^qX!uUMpw>- zA^juY*eC+~c&?rLOBIqelQidbvyAdDWFH6xQGJuQjWg93*xkqD2vp@E`}XJU_##gyu)GInTd0-jo4$Y1jQD-!1idkNXE z?rLAXnyt6PU1h(Ir8Tu~aa_OppY?9~%oNpjuh-9BUM2e?M~0yP6dEZ8nM^R^xe>DV z&Pjv@&=w!V(T@oO-T|znrI7*Plq7?|K8)y{!=pf>DGWi^NJ-B7EVg=Q=5x4b{PJl+ z31(ujs-FW4=&dV&xf;px**MIT(6?xss?iMdQS>MK&(|LWNWsn}Qkr>odJAO^4AACo za|N|q=5ApD(`CQ`OVuUpGaSWcgO)Y7UAE0=Blm5}!L^qUMckIpzm@tCLOwpvF<^eJ zm&x-YN(9(^eY$_+Q{XDlUEgVTW#=PL_S1*=Wl%fivwhNg6>K9*!nPcv>n;Fj#8=_} z&ZqceJ;eJP_`Kf9T$V&&8Vzj9cw%A0rK?YAQ%lXCGe&perO3PI{26=5@xK^f1=?tC zPqh;w-k#Q45mJ@yjcEJB6BaeNP;}`N5xK*AViL8q#oQw*%C3( zDS+AiuhJu>M0+{$Z|>65)x@rF$I^60JFH<;M6Ww~b(#m*IS$@;H`Sh-t+(a!NcvxzaWFqcJB%^}A9cgJYOt@_K<6f^SjzW1U!?c*n$gU)q--C2+C)yXb%KHkS0 z*q&wPeY;l=wLAIlkzLleK<0O+;BK6u>=j7H>!0P7YeIH?w*hZ^mcoOn7L@IL2y)`w zfP(~h49%JbG(y41uz^D4uu78-+a>H-|LBRkEnz-ji+mKV4!<$~FQ_?_V4Q8yiOLQ# z)s#=|)qF$96RVY~=PXtsz&@qLvyQvGQUMV{1;oz!bNyU8XE3^v`BY>bkN|}sNXp*j zKJG6B5Xhx@bjK!$gM8>M-Y{cWCc$*rP>Dug0Hpruui$uwSt%a|Q-fNxSP)kK@Etqg zyKyr%rz^2raaO&zhpH)$aTc{UHR7g%R54M(^qenP1j(ghNYG@d^sZ{Q7d0>1TB|e2 zUO;y}!(#z>L|o*kA~;;r2{sfDJ_cyXAu^VFgy3Qc3Up{m3rgq6ApQXh@o%}it>U>t z(7+3p9xZ4B&gw&pUj|H`ouXTG(PnsLNfXOl%5t-}cTC-f{lj04QggHF*pK58{3SSF z2P23?;n)c5A|0b+s0mAwBy&kWBMFi0M0P)=gUf<0uJPV11W4GZ9fPG$)Z$|ecrM`f zIgXYO{;uG5Bnv8ZEg!pkxv;4b+S+E!bXwopw|2E#4yt?32swI-nG%o<2WTBby^7vr ztOPhw$6IxSc9ER`2@B-y5`W7o<&JH5`=b=j>XUYAd=A}s6;jVw!mvB z`XC`Ed#qQHheB53I0BJJI{weF5fqmN(mAxI@L#s@Iq`AAoaiQiI*8by8$2qZm?6hB z=vrWJ9wJzz(?PdNI{ni8BmzZqM9PN9H!T0zr@2^Q&}R*KFcx;=>t`4eP>lHtTl6&# z7USWRZVY2DZys-j@w%`&Yss=p|IfFJ)_TzEQ_HUSENWn*|MT3%AjtTBJCHNrMsBU2 zII6P%zNd|1cjxjz8I3aVt?DXFno--Z*t&kyfI3J>fv*tINT?El;hw{i0CTsd(hH>! zEc>{30wKT;Gpjr*?;5!VEN+jsb|gKmZkW>0sgCD|u;%#R63Wc|8w^4@UKDbQolLjn zk(??uHUz(dQj-uaJg--rbg=c1{c*B>6ASc^zY}F>>-aDHTd`@j#7I=iUxECSB79!b z3aS~6rRy4e%Q}2bA{W8O+>1@Op5=Sfrym|4V|Bokio!cW+gMG7eo}4!`nMW*3`q{ffOOCMAaK7Z_-$ z=t49HBxnS%%^>LjP5}4KhbowhEkU93n|Kg3DOoS2B4vTHH7P9um!Ml5NXf+=4C6C;^jF4xLAm?!G*GrpLXvd%x@K>h#j^Tv=hj={yn|3P&}*1Sl4H_4nAF z)OnuY)y~1~oaf)25nf~jvUB1XDdrK$F6tFpjK}w4x(S^ns$v0rXZ2?h>s%0f&AW)K zg5CVz6&wrA1K6J_nO>dapsSe)ncDgjyP?e_GJ}m?K!Mj@K@qs4q5wXSYdPZa*s9?3j^Tut5}bq)T zr*fJq)plPcTxI4m?pbT_NV2+782)8-COL^z&|x%x}TcEeM0f~>G!VEP&?ID)!Y=t#mBk?m=9_W3d33%4qi8DOv|F>H{k9JQkLNszufOIER2z#H=Xvet7G?;~2*GNYWcUkV9S~Wm`;>`XKgzK&#&D_r$(;R-$WrG8Cd*KZPyD++`&ABv~JVN=Bm}i#nMMB zc@(Cog~%O?Z^)ObE1}|1DJ!H>!J6(SZ5p+W*y*#jS3!Fx;QAX-MCbX?y}mIcQ+6O0sJxP8 zEP7O^S1%?35tNeE%2sl6!6s#EF^)b?<7@KrcBjogd5Ot)`jkM+}2{UyKOb<}6K+n}`mYe9Rv5c{|xk@_e~(FCIZc@OmHZxP9@m_i&5$XwlWk zzFTG=tX&}Qca?S^UJqyNzuZc@jxOCCyowz@)u@_#!AcC7%QTSB68Ob$ zh(D!Wk!r(M<^Bid_5WD<=D*7SuIqfVJ=MvctjSHbn`}4Pwl%q?CcDYDZBMpspPuu* zuje1=hhF=+G*jdi**xP%_GXZ{owUh zmR3d6#}E;j45hO%wzHV1l{!l*tASby)68TYJ^7c+A_85?h3Ya_6O+Pq3B4ukGmmD7 zAkPt!H)NdI1&xCy3RLf}=TrDs3|K{Ug$+nlyvgXDOI%DwcJwEzzAcDms^9z$|IFns z0F-UhEy{qfCj#G`;bI&zhxMOz9-V%nGNDN@WGN?dQ*%RfHq{*;>o%9i=UUshUXD;l zWw2h!=f(pg%fNnKiE^GAlQ=|-*)Y~1#l8Giv8-)%jB%kp9SO*!SqBOyLtSjR$l&|~ zpwhwz61eWk3iglIZ!NAewj!Q!!s~SCo2vW5f%4n1gXpCX-+6g^+t$;U?yA>*s>o2f zhEzdRXoI-s&QSN5mJd|u0hxo04kbX?q zL5~=T9PtA#*-2hDm(8!eT9=M0pDq;m`FFqTi+?0npH5s{b#$$^&fzBwf4c^(cZ>7uy!-+A~cu;ktk&kB8*nK zsdYp(tFcq6Pt}gX5oj&)mWMHm=J*PT7X-T!6h!c`LzJb{7Xtj!8$v>hfV%Y{yuQI- zH-F#zZ3=wc=(i#6Dd_Z5F_~o_q&`sBb3tas>O{jqWMWK7X3uhWYcal+x9c$J@9GMG zFr)OuZH4H%3Jw2NqWM7vdAzCx#y>^BH>~(=^>2fhCq1rK!0Yg;po`@Z_}hT&>$UTA z!_YYG8z zqm7<}g1|E~;K8vHUIbfnPRTD6OFKz@7ByOoSXYHCd*9D1PehR9Kk$E=Hag9pg7h+^ zg)vI3D$$ZVqiR&CmU9&i-(p{VdSUy|g#YoV&YWkZea}PUO@Bw_;^36~{%^|UD|-iq zd17q~7$^eX|I5ilBC!3@wk7k$>Azg5+KB zqVcoqqC{VA`!UGjk)?~0xzP>fs3Vj6;Dhqj%`Ivwt{S4bHoM}P13jLjEH1NZ{TypZLseuHIPY2Y zfqFw__?BX}F!*9Dtr6b)$hsI(J9&t14NZ9P!DfURv$kwh|FGSH7ykAyI;HpR&Lr(P z6VzLFvX#*_`wSLldAhDRTQhka6iasdn1AjBPXjkU!6_p9T7awUdfUCew9mTJg2}Vb z_Pqv0lAPCTb%c5A!n}I+(0#x$U~(2M)q|D=+yEHhG4kygLjp*N_u3oZf`chEP@vCq zkI_ai0c8C6ReLO|aEt?kWlaTnxLGce$qADQ!hj@Yf+j$Nh@jk*@%)**MTPv(Y^R@jZyaD`#^Ozb{@RBndyP&Yaqdpb1K_e znq}IQ+Vq9F!kO$pue)*C;YTc&wQ9V15OCfkf7< zy2vT6(LAmZHA47jZ1hk0XyP8I`iaFZ@-AC-pS#@p@@ee_+o{s|0ShHT7wc1w zeMD;`P`H=jvX23tRMM1aFo+d=ebAQAdVL+@zj8xnCHF~4$uKDu8ql$+JAx$!Bn)Yz zehM4cPw+sSkt*MPQO0)T`Ex@OFH;-kNE(ZsHz~Po&|w-)qT_w@ezx z_(BYfhd{<0e)0%6QFeFbSPxEA^=glcYyON9;u}l1^I4`q5DM z&EH6Mqg4P*747yaHg`Kc#~yY0KU`LW&z(yKc>KQO?|S~aFQ9%4zfRi&F#o^lt+gBD zrQQRAo&{!21luDg6qFK~G2ckV3j^0n@rtlj!G|wmG7`f|9NT5FEap5(On4!Dl7MX@ z=-Lo%QO(8>@$oq{;+;7RqK|8bSs>S#eHt}SVWfgpB16MaETNc8kdS&U=8t3hlJC^x z$j3B4GVxqzP9Rwbd4?jsGY8-!GFY*(>Thb6>v1f4Y~~tW828_~}?JXT# zb$SfD0|oi-R}S;0?FHXwwLX2D-zt`oK&=c1izPvC*~neBd^;Du2v_GfT{SCpH_fLn z^`-B~6DFd6c?bSNLkv_&W+Csgk&z(n)|2}gf{TfI@pbvxBS&N@Wa=WLeCp}~Mr4N* zeIf?omDP{~{`c~i>EzXu!-OgkQPag}Bxy%4oc{2rSCbxGjj{ICC?IPN9ksV;1SXN! z>qYTW@cxP*E!1NfX{g6BHe_EMYQ?H>3VTDP3mD{e0GWfOS*oduFe&Ub`;Wy(8Sx{)n?(LaNG6rT}f+tc(+*_$@iiqa+LujK&;8x znuHcsQStmj(gcWK7*VJWIH(0FwEfX759XB=+bmuea-^H7r;28_%qyHPhq*~NtHf5l zg=2H4u$|*}o!0Z9VJ>1H(~XVp3r#LPa+$=RRO^b9XNVFkN! z_^*&gEY!WO8kM8=%6zd6{Zgmc5itSqA;WoCno3!6)p9>a?0789H}g}YI8`<5JB^Q? zybXljmp1#Wx864Dh2L%lVx4o|_Qn)}I&T+EW>-SICzs<`#mmx@zbW?pNZE)uVhdc3 z6D5K9hsS`xP;C+8Tlm+AeLsgvP~Z?JM_$TZ6CRxIt{1GG5;zyYNExY;>Zf*J9+fVy z#+woLad-;izfv*26mU8@rD1=}Z-cUUlMcj>lVYhki$%psRy3EgvpYjNf<2O5#E%>C z1w?7{e7`}WyU#y%oj+0Pt*hMZn(cbApXBj4{O6v09_o1vs z(SnF+C7QI;dP1=z+g7o81ryc^IJ%gI+8XvTynbVFa0RqPPr6JA{tE_6ZZCFvl-A)G z342Y?y|&Gf_SvD<8Qu*6X=U&f*ROz6Tb&Cl5*M|{-_C0&(o|Wn)Wsj@%l}RJx>qbD ztcE{6jj6e}3OJavir@_C?o5v>Ehfw45&|rpp#B7q76Ypk{g9z=&WJm*tw8gB1lwi0rzIF*K<*8sM zha``wdC3~-E#F30bvw)(cmout8NPDj6JU!b92@7sAjgN0tuJB(kV7%`0peC|C!onh ztTBt3t~K9c5ai=s)v{>CzkL%A?rSnR1jDqdb(c)p6 ze7O{zbTid(<_D9zxs!~ZdVd}48OUwV)?Uc(V*DxRZrin0zNkUN4>8Oyi}wD;gb($L zB-r0lsGDCOsH>VXPg##IRf$;?!4vZ*)|);{EGVxT)48tRSl#`BKy_Th9R>8U>n-#? z%n-iiVS8LTxpf8F2#=rG>MFB1D;BTbs6UMM&w5-G^2**!cbAB#9u2iQrpQAhhzlB0 zB8Zx!rS4}T9Ny0x`X?J8s02$E;-|D@#ayZ~#)@8pt7AA+2-M|@h@-ymc@J`)bbutK z?_-2OuLvsvGPylRhs%FnYe9U#|0^S1gS0uO&K-)3^)*5&mZIP0nD|@Im|aLKCsA0d z=s#3GV?!1O`6+7^SLL2~kOlc>Rv~Y}xWJrUro+*H)9#w`M$&#gzYMx19)Vb4yMK`n z7b1MV+&Ge5@lDfqO zrq6h=pVopc`nV2|uu@TIii)I8s-wHe`Q-6`>4u`6YZk<$=;B9({!<+fo?58oao@9q z6%-;Da28HcH^O0qh~%v^nCdlh)+YAd@sap?)zWsE0z{(P(mG6F6J zH--}FirIRE`yd8jihJ%g=`D2Vk2I}c|GGL?W0Gsve6DT_+8E9~a%LTK88+>yN04it9W}-n(neO(<`+>EQWSJIRfS zjmRN`F&oGWYKD%#v3>7%NNZ;G%t%IuE&{__Dikn%=si4 zHcBV*Fu^zpRyIOkbd~QWOZc7UDQi+|$e5LwsoUsr0b*&YhxddLPY4sgcP4XG4V;%^ z!tN}XL3b<7pLbWxD4n3w86CcE?+5oQLH^ItOmq8gtDOq>>i2VCh2RGNXOR$2RgMk4 zRIl1xEx6s_?jBkctdHel+G_z2N&wTd2C$X0(=aBB{iRqNA%y#^e_4|BiTiK!eyb{Q z>?Gn2(H3E$PxW&E;c*&)d3{w$-iN}>ov`j-;P49R0QCSE5iA9Y@4aqVigP_H$j zoK|e_D|o&B29a;UE{q&8A2E=L4k1jW*%M0RalH?boglnlh%QbbriH4U8f`{NZVoLc zYl8Ue|D3+B-*7TjAqwzglHkSn5G%#(lU6X3H;G(T%9uLCMr{sMMC8ObB=S~%{bHKI z&>Eox+fiQ)AU;@96xdT0EM!W)jF&(|sIac-e*2Jhl^%NLp)ce0Fk%!B&q`Hs{hz;h4TrvUp( zhQL{#Olo|Ymy50dlWzGk|jp;Cs?2{4hKTr;-y2xC?bTg{Mh>|K36{ zXF}NtW^bn90$_;L@`D||V1(W;`xFCT3&L~=TvZcX9irN((UeF0CgX=#)s91xddk$g z9nGru+%3LU=~{F;q!?*cdns_&+Zk;qY@u~Dzs1>au7M}MDNocL2s+R2|IBc)^ao{5 zQ+2c~KE1nr+IR;6iKSlrub%Zir(E_@)FdfV@#FvD|0@lJgqVefGd6ifMsJ1<$$ibz z?1`oFx-k{X&Jf-&!W0JwD`T4)2YP6h1^nA_`TruF9HUxbQut`;Dxy!T@9X-^dVBj?D==HOK=aV6KowO1Y%0a7~wYQI~fE=6F~QH(-Jz?Wu-< zwEn9)BSaYhVqmid2I5z0QFc>GcGF_^_EM)GnDFviQcONAx6pkr}17hI-ibd)f{9j_iK*K@$x7mS#=9pG)qA`C1sCBrYTv1GSU!)CIbJg>BAH3g|NZ{6(Y z;cXFlJ+1Tu>_FF%pd-7C#)qMo>UXoj5}m1cx3`{d(B|V25(VJr35B{(?7%PLI9z|K z0DKbeg+|}@A*&>uE2biT9XZx%PPqRK{tG||a_JgneTHICinS0aRDY$HyyQ3bYI(iP z@N(lDjA11f@v+IWVX=vf9o^2&ZF4QqZ}F_ z)>xw?VL3DQNt}Adb^P_yZyJVy85Wf}_BOi5;GmYcR1xagVkeQ^Lou*Ygb35edv;rGvk=M)ty=tq zMOsc^f@Ujj;^pj}uLD3EG*4lgWeY)z;JG%~dn!rIxq(cv84f zM#E01(Kud=?$hmkf6nCV)em;R&%bL)>>GNkSQ4(3uYpDo0WfK_#SoFu!)U*9pTz_7 zI6jmTOI0xC0{BV`Pb8(DMZSVVH?JWe2SmS`Kt|-=!u}l>{=^F=Dj3rjp2kC3d>Q=i znX}44DKDh!HCIWq4mW2@E?_=qllshv*)4zCEDPmU4jQD2tTp1L3NiUC-#SMR+eIxX zXPMO4GFTSKboecH>4*?$VyY6;RNQR!3U6kWM>)!D`=y$AZp}wE_+V+YcxA7#AMRvG zWA!q9;h-YT0{Ff&TOXdvN%C2G1J=UD%L&$3-;c!GHZ#V9KaoqF|BS&$6;g)|6)Ts5(WYyzC;Mm&@$lK4!@J|b0Nk@4<$i+XcHx5NF5d? zwq8U&+Rg@`aaoF>>E6s^iz2fQw46fce^tSV44Tn0b?as;ucYRZ%vnu2#h71~<108s zh4}qTw~AxvH{T56f4QnN$ODN6R<`93kW?%trA#a)0!1jBw~@*Rss-aEuw%uqZ84E! z6>et9+PhB4)M!kq6!;?FkUvWBnYQ>G2xb6!kGqdv0wmQcMF}IO^p&$% znHtLO{ga9ves}%Mk0fdrkx_k)S-q(6{mAKr*b?J`HH2sifIc>iCc9AP(*Td^IuMXi z!)QVPKe2ZPEiQ?LR6>&!E71FT6tMt)=ZxEs>@}d(!ty&gk4*hBg^wtlONeOvOtYfE zmP9&BV9W0M%fSomN0cgWqchD5vEwW#YvTSkdxIv;`|y9jrm z{xf$~WuLR@;5EK9B(Rme(XsthZ4SCUong)^C> z#%w!;#qjbq>=-!U`SY_GPfQwIJ)1uZKGj}_0FjYrYXnQ#s!*!5Nx}q`eup2^-isgz zwKSB%SNv|Mc)1S-*RY`o3*X^YP#Pi?a~P%#eWMg)Fjo>C=nnHEg}37_?*@pi{fA2Q89^plr|ma$XBIK zO^A6Fs8LvxU<}0gznM-Y=V|VPS1V4y-*A%5qUY61OShLgGajRd1(o*To92c}JC{H% zDFh$C;(f^l3WJPBE1(e3S791k;J{I}SZWqe%GeNP&S^{Rh`;E%=0=tEB)oam|Eb8v z%w8>_vSouJ1422yLbjBJ;1^mS9Xkm>MtN{!crh+}t8(qyve}?aNxT@H z1-r><@$f(d*sDgL64;_??-HZNlt!Oy-P!2tSB=oj?={?4L_s}0MaMX2$w{=ZUGeRA za_x08@NXv^v^2T+^Bv14()28L7z`$62%5q3Ch@y5!H`}^Eg}X9B5n^#o~0PA{0^Gk zZn>ABD`0@3C(tt_1e#C&1n@mqp_`%khu!epyYL&OH|f|K7g;S!v+w8aDW82-_i5!( zldsRy4`$>}UngtFVli>37}EUsL#!dPSn*2dOf|dufl`qJO0nD?Sd6f5%{v+~fDNW%j;dA8$088$a=MCgfI6@s<@})f%|PH$hCt zu>v(UarwP_JaDt$j^qAoL+qJ7k&>JyO0R|XYhl&z00(4eZEUKQut?6|BH)ZM?rv?w zMD+AY%5jDHcznyQt|@+t4x?2mTfG#c*Xv_(cbrNeleyZQY$5OckD)z#PLlS!^J>x0 z=KA>rU_rCrkydwKy;ZFH6WXS4w+C0H8?*O@!=8)QkuE2h%T6^_YPsYWnIk?mgTSVs_x!P2p>mK8sZ`Qc6xUksj!K+M{>4%jr zD0#Cn$z14u4&{lt9AEk9ZWv}uHXXwbegt-*&{$lG)x#05 zYc|;)UY%?wl>R3QiV0>PUVabRFk07sa7qz}>LVugHF~L-2T+qe1SY8e1W@*Cpeg!m z)$#9@N)x$uF$*6#ISFegX%Wy&FBaakLCr(KppH=2!G}fp(UN52gNcfo81P6@3xC+pQJ`a?qbOOY{7a@s z4UqA_KM;C~cwbz1{SMrS2*4xH3wVTo?k7!5Q2+4k9aYQy=bLz zRi%+aa=QLUiw%KZj8gT7DbNU;RFDQ2nqT;u2bhW-Tr!ABAT4ID(_ssR8vz9&Mjtvr z(qbGz7KXoU8St5nsUlZJwqTyYseK|nJ7oSvB`WqrU_z_&EAiW!lhuo4k-&g3J)>uE zDSbM<5){@%KB4!Kw)ZHD_c8{!Y3U9BM?CM3X)pVgkkVV}u3I`*h=7GR#ITn7v9AcN zUiMLQ$Gt`L_^_Qq+OH@r@3V9B*Qul1S=geEZ7=9_%AN)6vTu`r%R4E!ODvMdX~?L) z`i1>qWB&3QKsOveP-xmbO!0%>)TwCcTyFYIncI8wPjsq6%S~0*I~36{gkyk5OprJd z6wTa-Pq4)jS!tA2u`qR36ubd8ZwQNSP&gfo;NKY1(8}LN(S|(Ah>8q-yfGXoufAw> zqJ4QX$5B5|0e#*2FD5NN@@nevkY}}BRyLdwUvW$DEIgC;_@y0ZGpq>A1jfx{x^F&U zquqUO2g2N|{118)f3wBP1F-xT@AtL>1r0GJ%)X6C5g;S3jnl{`UsQF0|t z7K5(8XWH*#)qR2G?KU5MI5gb0HtWqrj?;jW<*oY9{)8F^wRiPC7G4x(zyLbwIE|BPz6sARVbo}tkw#u>SkSH*jQH-WYP6#_)IW7a+ zW!LdVrPM11IR%1KnX?w7)r;VQPZJ>R`P0V+|^+#Emx=PBGOFDs7Sy-%G;| zH834csMw$u!R4)Pvq`7*sI3J8;L!q2kyqiGNMj7HnD&0)a zml*)nd(Fx@LZq}rk~BCcLETHz#W*dH!ruFEvNgVo#o?c3`@Dz@WtLwsgHs@nCK1m!8P|hPE?qX!VJGLan^V_URzsvw1 z$N&ya`hFg7u?7G_dqie(=daR16Zvu3@voDLS6RgKOe;9ROqHzVE(5KV`x|E=-3H6I zI!W#h0jpkHt3fT5MmaGc9vmqQObYQBLOHs>A_Ta>@kp z`bAS7H>3Z3=ci6DOw-kB>XLZh!utAN9mXaU4Z2 z2$fmOTexQ9`bvKEmiHL>KzOOdUgCG0L~GD@XmDEKIN7x-KwRhOHsj-W(|cuKjOgcWj0);tk@cAedB0 zhn(sPQx7Y>j-UO+8YDfYn|+KLYkV+?_lzV=>7Tpv(xu+fZZZ)ir=;7?#5vE z$p@(Uq(0G>0-F5t{?`18_A^rZF81SuCfRJ`h6lJ!((v9d)7V?o){|?;e%fTH|AmlP zCBP6|#Zzd@xXA=*pB7Rypo)l2A(luE@jqbuNbxL57uDYalS1oIl)bQGno1kWAaY<^ z@n~_Hh{%|6P&}bue7ZaHpjB#CmC0@JBBI5K%FV|6`ihz1mB0 z1;*gT)L>;_c%>md8!MkL-o@gnnHuM`Km|vFTPc8ac?yV=7RaIt&nDJ`ssvMmelvRa zlf;OB{rp92^V{MPtcYXAcVOl(A%~F*oJD8$xm#T>Jn3IwQE01l^%d?hvhv1F>yGie z*UnUFIoVpZZ5yb}aTQw6GTL#wxi6-MouZ=}yad9La?#1r4IxwcS&C?VlzKbBU6g_$ zyeJ~Dhg!-usL4iCN@cpKJ)4vu&NQscGpd`?7OF|w8jwQawhjIib{0U)F@}h!z zh1Xk=R|h(%-p|6pcG^|y>$o+a?*{6r+_85?-pmr%s>&cb0nkcYY?nT^x@t|Q!9kMV zov+0=ffHgXA`!=XeUZ0Oy1(ItAdUmpX6%OkLP}Ni18rAxVa(&)i|(f@^+s3s5YY?QPfF+Z@l{`+>{V-c7F+77}(ouDkZY>F2wdP?_je*0-C(6_dMZBD-g2`;*$r(X}6d zB|n^cKlO>jSdgBM@zeXc&Q0jSQN z?ictMg_Hh)=)8sE&bA$kdn&=hG@P9o@Uv!_=?7~69S;umnjl=37SAhuu^3&fLL3vx zzgAT(KNST&cNN`SQLlD=Jw%BmIWIp@-^FkBr-z`UtQ8#E{t-$ zka9G;PMk5pbYW@TtNLPf?0xx@9B$v99-0#Vmosl01^bo77XO2juSjuzoUUtUqFvf7 z#{CRfejk>vIXUs0?=tbB+^f!*(w*-e$IzDFg_UEV0AC%y-D3oia6IKEdX=J5N0!sU z3jg-UnRl(uv#;7Sr}Y#d8)-K`KxQsJ34 zc-g?ws&a+Q`vEd-lcf@lUoC~uVc4ycGa?UvlN|Qy6|ypIAJPvE0+0(d3d$|I@{DTQ zI^Y{Km{#z)o`W^1MJlPSyb|3kh341c=GP;K&Q4t(I9Fc@--5aEs=T{*2AWC~fnIm# zH+WM-zQ^}F%H3Ct>)ot3N9rI~1{1ET$cdWl?ub}{k%q?z_z(0Nzkh+w ze}`8>rVOJ90l&*syzLYF%G$p4?)jW~NmPvkt6gdACEeW3)D5yHhDv9S*!ETu zj-j_~1@YTNx|JG|;=?VSvreHhYlmscsjtQzWTMJaBTRio zcz>mWf1F{e{1k>?rh%2<5r=&igTKGN>+`W%zLJnNdwC zJy)q=>gL(Ko{l*i?QWyd1nWQcX#BnGhsN)28QR7hodU4M?j0d_Br|1Os8$>FA%YAe zhKwxvScLpndnQtxvC=Yy}y8_ zQ-Wm))CAPjVlwd&&I(tF!Wr_{}-TaSLZfpwHfUE!uRp z$HhdgX9;R7$V71oBp(>d@V@1HVbDzPHhlQJ3!M8Z)H-L{3U(>1-0S zRi#|*%iqoO#4c{Z*Y`h2`an)!h2bC{C0`WJnI?$Jg-8KXu4r#R)X7Qd8%NdK@)2F4~EFbgX3DCH*~{Mf1ZO*HiOIP0Zew z{b%e3ZOjFdlC27xQSF_=l~BHhwlKu{Q<-^~_^JL4Y%rMoq8SPVTkI7ckK0+1zIPVt z3a_t$t~CBDu8%!nLIRk*>2bFC6z12M>vphv1K7;;ySF5Y=%{y~lIWZq!`bHsUC{>3{BD!n zAlC{gz9v{V+vts_`lotDWOf=^KC?XVf2|1?c?+-@tk2AOv_%rx_D_zSmyt;WfInNgf2Yf0+Y)O_xcm$1#$%Dhn_iHJGHZMZY$Nei>^F6EbH zVLE`5o<}9`j%fuhi7Gn5_ao=0hVI9Y8ZC_42FCZQ$NVCg?9%rwS&V7xmR%-e)$jgZ zY-y$MxR@KiZCjvR)~PJm-e0L?UC36nYA8D~0TejPeqr|IIO`gILnE+m)PjdPis2+h zb-JDfOeDfig%p$#1yLbENuo;3_HL2Y_vK-EAy>lNTZ&L`tA5 zB=+j}k@dpWD+*2ux5#Ey*kU~Uk+NJZBCT8PfWvBidw7i9bZ*D)?%v!{O^dw}u?p5o ziXLgFDk@7`{V#)Uw*1_dY0#>DUAO-#E0;m)hBd;x!VeQx{&*0faiRm8!$7mEGm z?v2@{bW|=H5?(%7-Hy~J!OxPK#s?0!1AB<64-Mt+F|uc84pne0V7q49ZK{gmoC6yn z0evV6QyihSZzfN5ur!P&9J!N9a7Lr3CH1vKSL+_~7!YL1L6|mNF;7sW68ha_X03oX z8NA&OqFrj=A3mSiqYS|9vk?%M<6^9a+)4quw?k=O;RQzh8gyR}7`hEhq53*|%H{sC z^4EPYKzk%0ncTMRYj5&cWLgND*q&kM|AQcE2D6Kj%^30xqf3S|=DKEt>bp1IC908> zEX=EjdKWrkovokt=(b(!LFmoO#k!R=>k7ezmn&Tvkae$;2KVB5e{dsb<7PA;G%txS za45^<{nCC69Tg&&i$tD~Dh7Opl@lV57S=X{QAAElK>M5g|KjwlF z{jN~r6a-1!upcZAME;^2j%kKNN=P(|S(+-Afy>hH2)!6oI1?Tt4lE6%_nuXi&O;Lx znvg**M1%*|tkoF9t_NE~7Eqtl2UYmYCXrBJK#@|f=Lb=0GK8p2ieFEq4e%iQ-r2hP z;#@%0BwL=ax4l9=wJrpErB?$hFV_e-&zL?-(1J-?OxwjKOA-6Cq>H`nXAHJ-2?R7b zYtn4(M918(V)z@MQrL$#`Mh^K*=b1ld<#L-oy2G#_|1;uh7W0=#jR)mXVw}U$@4DT zz{ZN0d79C>dF6QMremX3$VGFA6L?7U1q2BAQ&&U%A?Of|07^ha69Ra8PwV=fS}h^S z|2MW&a05wAfNo>VP<@lzlb^M`7C}n{)pcTYF?K4pp;d`YERzbUnY+=^>Ba^VEP^CE z1!!J+N{@YT-9gmkTiYmmS9vFb{bSZj_=5-k(FZ{U)h z%w#E|E8u)#wls+PUA#Is4WTOalL;F)cNIrT{O|hRzxvrc1|xYro?Sh>NCoX<#nxD3 zS8clHE=uuX#eI&(b}E+g@y zOKBBN=`QHBknsZoVO{8W437X6A_9t?fkgro2>Al2e9a93a-ruSk%_>kH;~hE&q!-=lA23 z7Xuuzj~_j`RP&e%IA&p5dokSdtO~>h#GIN224`N|LqUzexVML4z$gFnYlexe0?>DV zVaLe-obJ_Dc9q!%$|mh?xjJ&Amg?lX>G|uI4%sb^4Y#Cx3vMV{Va7bJ7F=k}S_1TT zIv8PHjR}+Ce4>`=$TvNYEP&$u&M2#g3PkiHDI76nN`QUSgTc}NaSO%`W4U9d$D{a& zCNMHm;C4xBW!SDq|Foc+zEeMKJ7&0KO z+G&<{6jTWeHTnc&7}NsVFxdwQd*$U?ieZ7dMjcyi89;q+OrNE!YIFs(?@XCW*-x%^ z1&hSdMYfbB%O}@re0H17eD7>u?{!yh*OAG2YtF1zKp#0$-kBBFML2{R{5@I6M-3j} ztfN;6{*>yme7juXnUk6fxoWr_*R>{Rp>w#L%>c9Q{q-12|!X7erF{cZ>1 zWlQ+o-L=zxf-^+7XK+M;{?Q&{5Y7B0$3OTk-yTe`Q(p6lBPu5;YY81F(R(IHBObGkog& zD%wP0K9SNQX{B}B3li#ac$~xBeJ~^`3G@!vHrH213T@9dJWUxXA2+>tMp;)p*I`q+ zYD^>ormyJuoR)os=^l8x8vQ3C@3=l7L)$*cFRJdExuI^KqFuH&oE@;1AEns`rl(>H5= zaVxE(AD5X!U#eA;A4xGyl$%j<(dx77AoCz2{%a(MbzVEB$7dvjKxdo^rg^>|u;ga~ z*L@oXqb8288Xhm+T9p5f>#F3o#B{>(^wlLgu+*4>yz_vfEJVSpCyS;?Pq|LaV7c#Q zH;0$^*1E(fcSeW8vhy3A$kpokuGnz$d0oJA;2|S(5VjDb-&k;Y#b@Z{W?s8?IE4PU zsBF+|)F0lL78@~b&DOak;94|q3Ey^WzxKs$g6wT+h{m6YS3Lkm+xS@y{iq3wY)i?Y)vYFWH z4wZf`D>xhBz8~KvFdy}F(S2vEoOIgMlCe=vF}LV8)&!}VR5jiN1&}0B2yTvvqq+Rw z$2OS{eV=3|FR=EURpGz+Y0VBF^b%J}J>2{_0oeMiTKA_AEZ63__dcW$Q{R)kELGa) zXgAh7em)NQ=5T{N-gcfOE46e#9)f1qHZyLvn5+3dTt5QQ>W*S+3f~YK8_M>fQ68Gj zP5^}8AYXgXaTK3L3gUmA(b+9V(6B122UZLGxA0U6!_yAHvcj*w z*Ay%EP4Z74k^SWOaUJAvG~}O>`Q8_U0?*xlz)1T2%@pXQYGsEUW~@?%-0xU^D8A!B z^>E5=Ht-M7?phK12uB$L6JzV?=I9DuTKLLmPdd8r3r6XGlpk3C8O2an(%{_df<^1P zo&87Pd>7STsz#5U*TBJIu_96#PKFU?b$tR4Abzgcc@|STnuGEEe=J=ETbtps#2peS z#UW^MEAH+t1xj%Ww73*^4b~#X-QC)v#l5(@dvFUD?B?8aenRriv+wTg%TOjVvX27(5kGU@o zP=7}9wnI* zU7yd<7Fx?)oK@t4^mER_t;U+{5M!2NOKykR#b?aHWJ?t8f+VRIl?`DP&?7Kze8 z2a3OcFO?2=%b5UigQqJ1?}VWF3GnO~2Wbh(1LBGY?3r8C!ei4|8RGn~Y#TIt6PE+fBT=^a z)mi$^M6S5cLV538;K^aVjm}lc+{?NCL*Nrloxj~lx7Z7NX0}tiRkLGBktO=*vE&zI z;9qPUMPyr^0=zf-b!O_UXoS@KqX!7$WxuG{#Ie5he2*C@ScS_}l!_hVD|<85{|CDl zYmEC|Q+d#n4GF#?N=LT@7Eci83I=;Gh3Gw;fp(0>kpE4BvUQpZ7Qg>S&l{UfT*xE^ zWcuQQZEM2oV>1}ieWOE!Th+|LC!|t4w?nc%y}4Z>1>#zR%x^)x{K>MVN_5L{=fh&v z-|kq8-NOdms0;-^pU5^Xyz%Rmi6F($C+Tt9HJc?wQtlTWgLso@;B>g4$50B^_xnNH z2og)gD{15rfANO4K*QJ=zR|o-CHE~4&-9h_L+CLY5CxdN2v_pp+cWKwk8*8g6M29l zs1)G0CtPF;65n|!vO)Bdrq~7Yby7NItX)$>vZ6c07~|{=p1Ni_{h;@N^Y#0Ay1h5( znQhia5hg)iSsE{hd;o#GPGm7dd{`G};|lgoJ{KTg&+rzB)+=4nxnU-4kyF4%JNN0B zwbJx&z*a3NAkcbc+zow!@65>6c5b%1b}rzL^Wq&R|I_W(>`&A05>Ha+o@XAOW4eMj zWdu-<{3)>J6+WU5mlCe#7DjgdF!A5LgMd`XXR|bhLSG)IZINi5r>(eeSe;|pW{8S+(5nB5 zaR`NUj)?J}Zkj|~eyEt1mYuVpV%EF>;I-=|Qk0f6@u*W;Ws3B_uk1FE(3S9r+-W={ zHEq*tu)L8e4e)&!{k1Sb;k!M%r4)F^`RHIbFn<#ahhL{D<>Hf$*`UX3qr-YK>nLEg z@?;@X@rMkXyx|Mt3#UKV>KTHtWrI51!Vm51Q&y!P4cD7Q-^YGvx3V3!=zD$@qBn&_T8| z6`I-laMIYi)Z`#_YBuPmL6|0}Cm1K^eN;OysS<`~`lUC9f<&|XdONXpXc*qG$$m)Y z_uhBr0wm|WAxmhE^H7IoCx$b0)kTF8B0T&}GOZ>I-VMqAj%j|^j1%ljcY8XS z8=Wr=58=scYE(SRU4(l<8RnG0KVjoB;46(>gLNq8<9S_BhAq;kmQn#upK>v`{}AK*7BO`^$2 zw!qZP2n0v3(k+1ol1tdd&lpnx+O&GaNXF&@8TV+`y#Vhhd{Nw}L0ibu6yMkQMx9Tq zWnYb>lPYQ9i=e|KV^>ujTfWf0=ISaVonVq^vYW(uSqHiFn+UYytf2u+x&}Vv8~29B zR_o&0*Uzx-+#K@TVHN8qho77M15-Gj8_U2Hj zO|K+QVPIP3MLeu%P@xF)b|=b!skwA>tlDij#A(vZ#6w zmV_WH0L}e^9t6emMZD;^kfqKdi0mgekBlXKW5L;G7u8LSfz1kRdhekmzxLSWF28&NTM}C+N^s1 zT==4v>FS5$Kh8BxQ$+kFFWLFrI()V(-;m#CJ-R=(gpR1cIv>0MA_D&8?LRVD-gXMy zKo@?#+*jH5>zuyRuV}MYC9Uw2lH88mmWG5{(9ulNA2pF~2FOTtpJ zkTf>5ppY2#7-Spyu5(jp_pPwvq-o;I>y!#^>jI~^KQx8U;N)N{&iUjDU?*?RCt*V*Y*ZlHbpx%h|9_2v!qHVri&Gh~YrEb~!&%vjQ-E(8P% zxpw|Z)OQ2l(c8SLIMd1|a5KN>q1PC^{*P_pBMS+n7I@ZpFTdWHBHHt5 z=6CBh@|*k=I3IN)%DIa>^tj=ph>vh7OIa1p+&LRm%d~0z?<9$^YD-XEksgEWiB{)p zm3KHFAKh6siJ!lZ?T;n1fhoN&9?OLOk_kEXh){gh21CkIfB_{(lo7N3u{)8z`a%HD zndyC(%DG0z-b+Z$TC(zoFB}tF%qgZ^VtNK!Xz+32^$Te(5YLaB^D^QOh?}uU(hG^e z17(6YbcYeiJIc9f3!PxT5n}>qJ&)>Z>6Ex1_s>5-w1#$88WS8YezO0pu2kIj_F(uh z{pTl>$qru=X(W2AQhECQ3hSaHv*;^1i#7vnavGD;JVHKy(1_h$LJ} zF9k68E(Z+IMCFW3#6bi~N_bTO;)4PZ&bm2$xi!me5F!)uK|Tx$5~?h#vc9<$UpD~C zhy@H;hGq!c2vB5Ca_1&-L6Q_RN!2;pT+|2x^`H4{3;gxq8tS(*OrK0Do#*5()^&!8 z)0JQe&#`aNenxTE8BI?g(8q4tkUeqdYpD=eHYB&R|6yElO#hlCswYz4qbV`_y2+kw zC(-c$nGY|G>u}%iOXL|m6LJ5%c)5n!8W?T*s0MA?kab!FE_N_%b*(S5e`*_9=NbJg zWs(;6mjVfj&l1dS#{Z@e0iIjuTuT|}iU=3c4Q%@xWC6arcB6^WCq!Za|2KBDM|N@F z8w>YBP(rB%lcv6%z5Obo)&Lr%Pgs&b!5)|8LfQI(%_H{FEX{c9JUULQS%|qdHsp=( zgv#C1`Xs#O(ACHIZS}} z(%-WX7>3uC2S@>jd7-iey){b41$6%+X8BZ13+W>G8`!L~N$TIF`cZ9$H8)UaY6t&} zDH0)y`os&S@&{6gi}nUfN%wcH<;T*HUz!!V<>X{SoLUIqAM+k;fOx~+GwLUa zv{qF=FgYI2F?GymgRuRXVsZU}hnW}$}52K&jRFHeyHfde@G-T)8e)zMR8l#wv zg|paFCbx$i?O?2e;&wW#>D6iPhZ}lhu1H;#%Z!@uI;iC={Adqb!QS6yJ5W3qdO-Z4 zlBiUpk{_;?`<~@0+#h@)^TU+HpXuw6f-DsO_amICElz?5(n3O$1L4B?$eg)=NnGb* zrf|6VBLLzJMW&aN_;L*Apvz#y;FKacYIQLxRbqpJcMNR3uih}kX0Tc<`*>X(+uVLJ zfkpO+DOMUi{ZPR3#d^eL@>P$j0gc0$6J3E8bBsv(0HA5ZrG0N;XyB6W+uZXQ&yjYj zsP^SZ)7{fu7aVcxqHY#jhdX~>MOQsH_Uli{Ed{DBYYpETbTZdHq~7=XK7DEu%rUL1 zsi1wcqgl#;A~_1vG=!GTMJ|t}^~MUZ6C(WDF(D^9?Xp-+!mI$q+|a0#tEP6VmYccPTG0^C=#Zs9g(tur%7dlx2=y88u_c9o0wbuSvQ7}(`D z(Hp{0NwdX@a<7d@*sqx-t4YAPtEb?%kh4Qx!glsim{yE$#iBl}U8|b<6CYfG({HbC zw=n*>#IU`r-UlpDYS$UnByl@=JYv22tT_>YOu@k@gA^7YZI0+y)a|cnL=(HI6Go~A z_>|Q{(tYt(d^Nb|*vc!JnF0?Jchj6;AEjpqr*H`<-diKJx;IFXVLH@fw76Q`zwrGc z#g7{Ytk(R~=B(a&3f&4uv%sQ#wM?WBrzcDk7mF?bBeaU1?$MG#TNOPm(IDbndVJ8y zOkKa4`e`hmbWDMU0;c=WEQ!yh*c>(Zb}FF0ZFGm=5Ir2JoS{#&2nxyvKYg*fNB$YV z@8t=;wCZn~-JPf*d%D8q%)LK47!dOve}*j`=7Pj;t=9HaEA`l@Zg=c<;{2vB4v6Q- zQwhaI*QRL_W?3~+F(Ke>3-~%&`3fK3f3ktA>L^q>necar=^7;i#mk`Q&0!xw8do` z!^4)$kfF{TrZuA+t58!Dq)F)ckr!E*{D>89F{1TxKh7QL)yBj>orfOUW{3`ZTscRbe*v2cBL!h97)14 zcCCf3&LPw3!S!G#?kg+nza*4dDMaAU6vJtpzR1PcJai7G;9p1x+rKQR(D&U!IJgiw ziH>`pv?AwFlo%WgKQ+<)w*vOvR|Z?k3c}zg><{fX>`}@PWVR<)lCUNk zws>c*Kaxc)I1YFMODLF_a)N4#io{*Mi8PG#%n9*WC=6Og71N6|e})x)_!s^4aFi-F z5%=VcuwYk`ST^#9AP;hZdlTZb3V1#iDK{uP{ZJl;d@%N$h&kW*bPE4gDyD5=Ro2hZqNT7RCw_BWhAfn~RXGDBr5XWCdA_ zXYH|w?)H?Dwuv{6l3w8}zbWf+=wIcc!N)+yOuvLW=3D<={f%p?N~QCdc#Dc0{Rc)^ z0v&bwv@FzA;gssqYkRN;ogDBaI*0B4Vpm}l^;a=W#Un^A!rY70eR2(t8r+iyO?rb& zd@NEYk5f{-ohKw|aHg>uKo}7j+iRy0$%GrC^ntgVN5oEEut^2D3*%h$?)YdR8~f$S zqi1{pTxFzt{jB0XD4yOp=F=xa~?1xU+)N}?va5T(TsR^jLX zh;u5Q=P_3%nO-9BR^tMF@^!Xq&V8IqpV00~$EBUDr|&3K<;P~6<*LJnl+UE(EVFy4 z%_BZ@%?6Ud0zJiT%UQ9Qu{ZLIj#>8EeBF~=$^t%-4+Bx8PMj35mHCwyPp_?VOE@7D z@H(_n^5k82obT|pRiMA-mBV_^llwR@daZ@^uuJ{*Ab0t!LxJZDFo7`cZxsz{WE3Jb zk(e!aKED}4$X~XyOf+hKw&7s8R<2I+7?(mvatmI`_Z5gW7?S^$?KBU|aI{0Ue_ZDQ znup+8ae@{r9F4~AD^Fr>{O%jE93-!La-kZsQ zeeo;%jS3o~nDC$8T$90ZRAH`oX9+>-VVE+_wMZFVNch1up{AO>g_a?`d{Q8D2L7s} zFa^cmyhA-?mnV(3T}wvSJ!!QW)|A3RF+PriA&{yT7$vH)5_8VV)putb=$0TMw zi14|t0+W>~AfH6hxx6>{RwhQIAt*qwLGm#_(ZuBj6(!%W_`TS;Xr5wbuKeQn_-i;9Ht98m4I$>%elByK(lq?x=T!z+hTqm*aq~OpSE5~LE{S)rwDCzIeZbG77 zVAj#KMHB}U6~9N%&u5t0sPZvfYQYNUBp|{yj!>x?Kz8@$kLYPK)%PvR4)sgVLsktt z=K(L-51gI)fzRyar10Y|iIq#6q1gFg^jzBuU6303C0cI+)$b?dU{sCiG^G8-5NDa3 zGuo3#bNjF*i30-y7y8^juCTCF3e2taDq0LrzUyyvZRA0Lkn2J~M!=%qEuNTbbmiaA zHylc5daE6QwLSRBRy+e5-g^n99)8VU2MV5kzq~G1|3W+vdA%MK=&A7S)obld5YJqM zCehU&vP1TJ91M&VGGo5_kEqnW&8}t(Ax`coP=jRaI9q<`&gwQkC-)vqN$n85nR#(j z;Llxo9VkDqUFobp%9NAgZxi01{Ecao68CfyI(@hQ2-_c7lg|h+(!4>elv={3m^w^S zZ`_wtD~>kFp9JfLOe#$QmhVE<5M)TGkRV{G2(mrh%a{eGDmwpY47@mM_==BDxXO$g)$lXuv8YX+E3@y7da>aN3UG!5} zE!+JlVYHEk3{ikDXempM*m4Bsizf9s3)d!{8`)uXx2~N9uNfqmTxcFZInevWugW067H6T&^59llr+_`>9O&#PX3CIc0=i ziM!-7c>t#DJ;-aYUQw;aNzt8)MIW^^HazYPGfz%g`pNd68W+2;fXinrAin=gM8x6A zYdP>%%gM8T~_e_;A^uOR-7jMcNJ^# zv{y&wkYEFK{%O^x&nb^f;9~Fwif{f31Q@|3c&`xA7=R#K&uy24#CuN*Lp02Z`DZa9TEee{;4THD5TumqPv zWM`e>T>SpXcc-?KL4?z^SX++v4gNiHoQg9v^m0lPMHDH*yI1Ht`W-6KY&}N1o_AWv z3Mwn@wz6yUG6mHcaCW!rNq;L|3$ySz$Q;dr>v4BPv`3cu1h+S-9bH3q};Xj=($N{`&2-EpxxxXD8e^SM>6FMTcl3;X?-F z!f<9kWi_S0kzU7?5rKml?S0DCa)Z&|i_n>X`i_sN)z24iORY6dvbk&8c1ELVRQB1P zHx#=}Vke zI>!?8M>A$?88U-)WC}HW53D}YGt1(des5FZeM`U7#|?AotrAfCdI#fqzO8BBdcE!V z2D`s5jT7@Yg184#oOpUE-2MP1cAEaYSo?eLF45<-lvC#peywymxdv$i$e5H=q$ua( zky#Y|F@g-r2}r=C?rEB(QNIy?6;QE~?MW6If2kK~mNn8-q;Uw1DmM6U$um;ha)<3| z_lGZ`wi2L`WDq4%Cp3nH`&u?h_Z%DD=M=O3*sT3S5qiV?*4}IVt)mmZif@^|QWiZX zX@nAncKKXObZaar-&sO;gMjBK+qdN`rjSP7nE%iuT*dI~45yd(7PG>ks?~gph0|Am z7uLKcWl8IeStx%bCLdX0~H(HPOxUa2?+z*3PrYb4? zC8a6X4(C5I&Hf{coBR+kAuMko_N{rE;`+GxZ&srz1Vhxgos$?Mkn z@sBK#j^ovQD;t3gZ|F=0--KSk-P2_Cxw_cHY5feVT~ph-qjK`JjlAwbr8nYlV8sb4 zT%3WWkc^Vub;wKqw0Y;9fY1u>3s6#7m<#gZ?ogPNfFI_EjxVT?(BCid`E0OB7br4e z55lQ}^H7nJdN&a6VyYOZhL<`*gl-42*|LIqQ0hUuT(Y*6t)%I+37HjG$tX+fr9a4g z)OHf@#3Dz?Xss1ts-gz>tXuBlpiMW#_awUD$3Rq}z2`*ZXtra9VQn?lmz?+f7u$u! zfhYcu-Gl{=T(6tiUxOM{=?{b5>w|YCPHSn+K31#4PL>Pyii;g$hnqR~*`3Wf{_3BM zzw21B={{qlO2S>{$iqHCLG=juks~46SU}$8V3={)!jCkZI@Nb3mH)#WJN|*n^jE04 zj$wzCg5Z*w78?0Mx}ZQfmHB2^AbiUv@@F>}C(tdQTk*4;!eXPjO*n?ShBF&Vw+q2w zF$vAj;rghd{!lw75VwcPU{;L_H>Q5k{$8T7c+Goga6y@JvAUYw0aSj7PdK^zBwFoI z$m?WnqVs0b?p!_1S6?dCk)?qJM;HTzL=@URB-Gsf^qa7T5{E}TD;;B&QhKr**RqdH z+5yw%t~&@r{jmGfdj#3dg<;C16-IasR!?h>Bn<_u=acR(6!pkW{)>R%f;Xu04CScsXK_InSY3;|Lnzkd-h*@RzN! z3HDkl8G`N6P;s@h=G}b>jRz_siO!&5PQ`UiNUJ>3r1*&XF`$xEvrec97llj(pe<7x^|K;{JN~u&cwWKzYw}mvdQCC8*0F z1bWuo%GcwpS_~}#u{2(V7bzP{cYv5C0~DEC;f6IJE}Vz!%ePXM_@+DaiIUk%T=$kh zHRrh8BzXD*7lP--AsDGlimeOf?H^m|ucgx^@@mQk>Mv_Ud?+;UwWs(Evy+)_7DFVs z`&)KRu`y)0Go|Ku7DOACxe5SVzolOdB(?+jyEtjeQT}ASMWy_H)9c`7V|XymrAAR* zeq@tAHF-NG_u-LW?DnynScA&g^=graF%BN3l>gFs`VZz}yzN=JtzZ3PklwYLyLE@v-!FVXVA()6jQ!dKL1;k9Xc-41} zLI3Yr1s2{Y*sDhOf05Zzw20WB9PBT0UUAl*qTn}gSKWH&8>6VzLnU9&8s+7vc&~nM zQstVSNWDwKLC3(-%2Qr-ULSEdk(}})5>WK7_$tL3|JB(94T|q)s)ch6^D_yQw0zH6 zj~3dSnPjXhaJN3V@vz&-Xj(<~;oMosg#u7YG>Qc<>Y~tqv(#oZRc4xK6deNa&#{)J z!R3_~`e%0YGkF#x%Lqd=jM(GuX^fNv=~^9UdlDVza)RG4yuD6_3}DSQsuOXcgwgsV zB86BM)SXmTB=;QicL6$Fdy*qor$5-;9wV;{P2;WDZam%(Xoe(b=XTaPEUf}S=iGmD zg@!{Compi-e)BF=5SNdvrWny)lZ?QuM{P{KGH};b627aEy|m_WmD^Xc?#hpjGb?Tc z(+W5LGG;mLq&G6c7dXW_d~9~Q#SQ`LTs75RF5MBS2+XrM!>;j--C_ zGE2p_a0Lv4Cxiq(oe_xg4r`J5lkA!yAW#!Nb5(N3pz-Kna$!)@B;CqjjxYqa3!*v$ zqIj2UY>BC}-)#;s513+40`-{faz9s*mx1&+RN}xjrvg0pbjWgM;aRcYr=VwFJH1Pu z=RcN|??5eW;rlYbyNy|^hv|=x0Rcx6=>M5xpN4kgp3eWxzIjyfc$y99%?NYS@2`Q0 zzm%RvwcgP`{bqp8aN6Ik(v6IDi>gcYHFPU_=Mn2MNFX?rI~~EwV7A30`YSB&S(#_%0ArY_rQ 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 B{=K6fk>xg? zYlcVipfO3x)(9#h*#zVv7>r*FSTu|mo{MG?iW2locX@YS_i|t~q&6}g0g{f2L+L*E zB+@r;#L^GqeOZdfz^z}O;VvrW?d15$-Q`|McJzkM)B>&HYt6Q7QIU+}3YZdY7#io&#fhR`zkR!pQ|ddl^{ z>p=EEa!P*6JwH2OJ?(b{+J-Mm+Zm{Li{z%R;olHXM zS#2$>(uh=JW__5jv;XvAaX+-GLRKKn_AThrQ-D8+3YGb|4E;F8aGLouNF11*oQ#?Y zd3;r}pdom?s#M2UC2aTL*tl>qxItc!z9MLR!$@#6S`0F6ev4jykewc-tsgM+T$2?^ z+`n+3oxs_j1xKl!H{*}tNb)9ULXG`1HEcs#h*9rO7plD9qOjeGDW&YXa1KsSUDp{Z zNubkPS_oqy#-`5FT+VsE)vUPS6YCp{0gOa;zJ_!!V`;?oVB#C9;G7@@i<=nqX%b1i zMf13j_ip?^8Lp!=BK*+Zn6Pe4{j;XiCO_~#9$tU}ziKV*uT%PO zRem|^VC23O9}|-XztF zbc}d&zr{k@P{G(W|6%juB#LmXIeOWY3&st5PX{wGJgR=@WWJ@@#8v&+@*0+1)ZK0| zvpyhfIjq_~EZn|2Jfn|Y(>7Ksy3v}1pp~!!6PD25`N!F{K2)9VBbY9~NPK=Qu7BBL zM(wkTYzaTRih@HPpWswk%?m_wiBTTJZB?*3;V*7&=X?}vb#|8fYk}cx?EAT7>Fmee z%tEQmZ=Ud7hLkbVB1IELAIkk>^lFBK8g7vY#$^L3I#7Dwl#IsX&5CGETxj(fk<#FNltGO{p1X83ZW+`zM@UvkJiU~nQoe2E4sC$Qwz(B5gG&#) zhU-5($X%jB8k@cj-z);o*Y~k9^&ryiF4`iP3hjk~$V-TcJ41LAZ)oVKd|ekj*}V)? zJ=)#Bh06A}>0MJ<(2nE8pA@Omn6~$k?!1BSq=ceNwfC1wN%^es zhN?(%R@gLdR}RE1*yHSNI+C3vm`lG#CqxW zqx}*~g4qr@rW#GYdDCX;oHhJMn2rW?1eVe67UQ|9XRUiDyVTj0L)OeLwvKzG2=!0_ z*aWhMcV8kVP8a*~R^v$tWUU*TWVJs#`bO+rr=Q~GL2^=4J0O=_{IsQW2kq#7_0yO> z(QE?$lCo41P=g3#N92HyXulfGqK>+U>8hMJX~&TKb)jnU3*yG}1xTM{-;SlB$Zit1 z(k9cge_cAJCXl{*{Ss->-?3UE}~ zCPtpd^mdu;kIyaRd(}^Ng06feKQY#6iE~BD;^OW_7tPWjv9Icy3h1uJVzwp(IeaW_!W*F{NBC*p8OVe~{cK}D+V;^Rdr1aNg>NX~3P%dv>1Zp> zGa5`qKNpG5k~Jz^ut|!jos*T>1-m6W2xrW*&l5yyh#Fa2awL{*%bdsCVx_ZJYh{#} z_ZIKgWnP}!)Qxe`^!w_om&|<0dcIXyjdV>X`uoxc=QbLtYY#iLeYt6pK-Xtk_*P$a z)Vj6jwBo8=v65bl&Dp@|^rj{KwpiJC^rTja5>keJvBnnDv+Wv!jJ)155~xR5udDHO zWX5n&RF~(;%>mS$P^CvpFCQJ)_B)x~!5$Ckc;!L}Z9y$TTMpj^;=(P_!~w|5KosZ1e-?TE+=96_#vL4a zJYEG7;9fvkU*SaI0;B)!c0RZ%4g4GpwVQGypsc~S%z?a?d~SF^NUFavJqOwb?LxDo za&5lKhJ@3_%6dzqpo>wL!>z@9ZMP(8#r=Zs7RYdSqUl$7HuhvuGqS34b_foPSTE{U zYm7eUUS~LPZ(wO87N(Ij9KzOv?#iGS3ixJlW1RZ*Cu+%o0~_*@^}}9hDr&>Uc5aEs z$78Xnoa$vo$~7ha*@d2}&(~zesG_ZhH<|GJ0>p?0C|`GkN{+)?H!P*Ygz$Yu73KL} zb^91<0{6_})x^lPBT}|tu!z3&7+C!jvvE32l)PZ7w#$JP(6UJ)@SW~DB(O^a8st>#`0$S8#y zk#4Mc;TP|o_4a8DPBwT;9^tcRh_(Tv)B0AjB54c0--FlB;!K#r8#v&qPR4XpyTr8{i#nQxI*tz9OX6wK$7K@|L$5vBTF36U z*5qov#VjzXq3JA$dL0olJ6_9dQMHYNpit-Lxca#38)hwaJdkiVY@dcDY#v%~V{fgQ zuMxjUK0l*~qAGblH;EHX@)ci{aMuEx0Hf|x1AGU6Z3kX(_eun2&;=_7?xY@fT7LZy z9i)I;?Zrgzg?iA>eo}}aZj-gMr(UmT&3ZSTD+$n!k8i{X=n*1OXauh5aq2yqV)SU3 zQIX!l6`#VHE^99K6CIPBF(NflK0XVGn{;^~s(tQN@5erOLo7w#jhBvEi6cn@V2FjoL81s1n0j!Pz}cRntsR^8sobD6r%=YQV~|rVs-xRUF$#^(^uF}@ zED91X4?mz=3=@QKXu;-mE8ZHuqX}$$1FGKN6NK_yzqSJEuw)AdX4jLmn>^qS7mT}e zHPm~^3rqWqSPIgCdO~%)zkY*MKRZvh6 zSCq)=aqy{0Pz6UCT|v*h5L<@`0AQUEoOo_LEsl zdLg`4Ofs*h*vF&; zG7VH3YEviBCpU~E59$7Tv`Hj-CMzfo5fWq!91JLu!9m~%?#l$0t7Q8k;0e*OC}Z(5 zZ@LbRF1GiB74;hvk^Wm-d0cM6a+EZ)3CX`gXsUPa^+GFjoQNckk;E|4B5l2Pa!^5R z)cY?=>zelC^cZb6C=?+*#TV~4$BLmSv1K!9e|6kVv`3wLX{YG;+S@vvtrpDP=I~76 z5P*w+)!9ibFcipV+*B@9&KH)#=5SMfTA3?fh9H@}LJE1p1}0csDe_?=jtH&5Re){= z($ zBA*?-s6{UP_4Ral@#vM}n-UqYWwk0`b)*Kz5kq1$nQiWjn%VT95dFcvl^xH}j6Gko zaNw*l()#ReI~j&m@Lmoa9bcWXwZl=dVeI1%&}mrcyF>PRC(ol#BM>U3q}-J*sm-P( zO%t`njYq&D93Prtr$jUQqQlhW&GnGzo}$r3jQV{Jj)J|bq3QZL!}>*8wQDMFW9V|$ zmQLoC=Ey%U5`wuW1lEO;6FZZJ+kOvP#3w5?T@IryLNi2 zBXko*nFtBeE+kP89G0A#5@&TC?)rV8Tk#l{Y*0iYJ040-O~{#C;%2W{VBfS-{ z;*x~3lcVua%TAM_5Jj6-LG?_M`*I?5hl1gZDfFeHm^k){I=tsy+%)8Og$s5Ok(apP z@AX{^K3;MP1?Y0_N~SrSGp4m`_R@;+Diah^qt;jJOLALT0$R8Hjwl76!G~pguJa#N z)Mxg;Y#R~EHW)(M37^EP2i+n(h|UdJ0~hR8S^gOEdflI4o$H_1e+H8IV6EdHs4Y_K z0Ng$FykfuQE=OMw!HXv!b{FBDY*00Bk}(S{6e%Bxsq6(}IgMxWG5)?KIn=ci=AsK>pLPOsHxmV@9rdH9dBpRG)E8*n}4ZTH-=fIn#^)+kb|Qc=<9 zC{1%#6TX?w2l*cM_JgE&civUHQ)pyDspVoOOl{)9h@z)JpH*hZpjCOp{Oqhk;x;O) zT{yIdMD3til{i{ec|LavzBzLOS~#@kF0g02nr!i?FL(Hb>h))&Z*=)`RaQNhL~^It6a$oK zfluD>-YqlvWj1$EQDQe8;OuH{-bQtEqr-*sXiYSC0@<=C1M#|Chph`0VU_?TP$umf zcBW7H;3;k;4u^dlGiAA2RdQ4w{953z9C-}5 z;>gXLjm`c{aa3yeFHBt8lk6+=d3WY^o@^-a!AylJN_fWn6`F$Uj!zs6^lCd|;;F@q zLOGAzFP0qV3(zw{c$IPOL9`n*&sgalANs;0XOC?kVeTz{5aCWktQJEmR;tAtQHd@5 zP)1v$K&}KIb&7vzEp0&_DQO^HP|T$vV`M@-2>;Ujy!ow!Kg3py3WenR_y$G&&`w3% zl9ID!sC+I31B&8aZE8BxNX~Xs&3d+t-I(?B2wjQ&%L3B!>2V{t*ZIN8o$YD#GG%7hIkQ%l5BxPhkeJ|^9Z&pvoH zbhztPn>CgnlcKPxDmI6S$)jIO7#qhN1Q!jCm?v0m6FU*l%?;IsOj@~pbSvIBCm;Jd zZQO)mA4=O}WGk>Iq_{gpuMRfN(_Cjpq(W_l95Mv**^n=Nd0Jgr%c`VofZTHZ)g6X_ z$G>Pkz;ESD*54)OX$_d3dQOcJp_~%6f)b%Jkzu-YXO|UwDJnzTliMkAPxrNn{+8M* zIF#V?;3qv6fvie*Iu7VZB?bBkpi*Z9{fCL1sH1RLyQ z9k1%q(FeC$JLG*fOE* zv4{U*93ap4#ydQBVY%AM!rOX2=Cr?F+x_AUm}H<(-Xmx~gl+q1au>M7{=6_Th;uM> zyibb`d;d_MLxT+a$iCH3Jv#Y%aq+ru#93tr?R>JVz9zFaz|Fci&qFu4#&V##IzPeN zMyJ-z!749 zBke<YQ>)$=Xv8$kFTN%Fy5~emrTgl^(}+byCH^?Ei^|&>+{|hnXp(QV`_-i+=3UwwX>@VBB zVrdUQo;oa_VMuSYrqc;I-$2+Tb45!as_@y7BFLMJF_~5r)%?hs&|FbQ_js47ZiZd3nuwgP}?mC2LGO%f(|>;t(6s4!mEO z7hK#YB3MclfufZhBw|DL3h;MQH}0IjJje2FqSzm zEFA;c(j5%tGc7?5A`HlA+i@MB_4yN4LW#?y`Yxu$PVv$y=DPxWS%FRC8zjD1oxQaXN4XEIXTGeIfcRiS$OgU-Utd z=r%kpr8G-DjU_`>ugzE_eq?iPwxBGDa%hHX(hTlX@zS9P>a7$D=&!8HB!V{eO)j>1 z2c3!rF+A8%!NiS4w>-zY<8DXnU$WK*a(5{c^KY^yNoLT53AXLQv!Ti=_74_+9U za^CM`$#>ivLcGBIJC$x}MV+J>yUz+;bck&Qy47>%&ylJKMSFKb$GN#B*QcTI)pm6n&~eTdS+#G_}b8ftI$!Xh$b z&F;H{@J-_g3vB|3+MzC%KGS06DLJ!;N>w6A@}dSau!g#*sqh(lUy$y&%a{yXhH zopR8%aVdCr)8pB2??7Bo@6o;&F^t1yll8;_*l_$Q>%^V>2qOA>jcuUEZrX}*UeCA^yk_lmm zu4JN>|ON z4)uVJ@%;@V+SSL+pm}=i!m7E|`Z*G9n5$Aa(EwcNqO|i0mWacS50rH4k|QT0hgw2! z91$)#nm$`ZRt?^B`cYO5VGU+ni;uY#dvHS)&HKZP@i)eAys2nP2G0bM?r)qvKk*SU z3qRY=8uxiuc*VyA5E0=+d8_&u%dksg4#7`YYrpWUyESv%liqSf5yd#fT;dtN6<^2w z(eSG%KjPmfyWe;^TbdB#4ts7h;?MWM>~IDLY&hui}P^&@1Omrwf$+uf1BKh2C<{0r;RLvf0{&G^=pm6XtZOvb6*!*2`*_` z1LFx0%N>C>{UC=z1e4DwY9&f7x)XEEsEZWFPw`gNe!+FIcI#!(<}K1j<~Q*MW|UZ- z`B!uY5Nz_V;GKV9W`8E<1pgN~2dF3NXrXKO{|TM@=fbQ1H-i;D-G4^s-VvWaqjP}v z{}M&|XBrUikG+=rGdlNg_wDZ#)Bh`W?%grP$PB>W069IsW5fZ4Q~`FScgqrhodYCr zsM7;Vy^mSwf7`79IV8Vl0~WIag0}zxB)@%9%z#SyEP!Q9?l zx99423v!_ge}M)94(*?TFikm0YkykUwkt}zV|Wz&38%!5a^lLN zJ=~1VxV%Wy_>mvM+}78|t6G%Qh<>bwXX|$mQI`rBwtVfy^_pOk_;yluK?|>3$(OM) zwMZu0?cmmo|9I4HD;u%thC{kfxePCx1@p;!^OW^L^^21cYmYo~hdW4n4Qkarg?aDI zY!mK&mlVIS5I$_J%0Zp2wIl)o$znBqY@Ar^ZBpIKG-s4byePN4j49uC)L`5o zTs%zxBD|S25j3zEn?c-wLm!c{Dmh7$ikps|xIq$~o?WKR-b{F$ItCs&NYg4PC2fFz zlsjWk;U=3O+Xmv<*iq@73HvX`CTx$>FDtnIm>M#HXQ+GNIoW@G2>l7s{0F@IpDbAa z_GbNW0m9$UiT_m;_xI)SPY;tnxi$X>AOwVwGXttf|0fp~1K_&+^YwDV4x^wjU-z^! zp8DzI!>A7&1+4*|>_>D6{Rrq+q{*B-l1L)@&Q2eO9%Z0DRxe&SjJiqD(j4$mGTBK` zZ0#8nzjg;9e-yK;$utEE{rCkUv;RZfTSmpv?c3f+u;A|Q?(PH)?(XjH?he5M1b26L zhoHgTwF&MHxAUB{?|Amz`<#2;_si|B(Y>gqsIFD3da!2C|8KI3ox9}l2KT9~EmU{k zwX2!uxSsQS=lI@lntzd9yFa_NUoRFtc{F zlvYuo6w)9O(kGPG3sZcO$T12Kf(rQcwW5wKrx+#bHSZ^(8LO7;YLUFG_}Yvf5cpG5 zsxjN=s3X{Se*-J~WY*pe=14e*j<8#4fwD;SdGI(y;1QAsgChWOKRC#cUr035oxX^R z;zl5VvJOngXfM> z^h0EU^E00#D#7*lc%8@dv+(7Y-HGIz7J&|Bf*-W71ymJlkYHc2VH0x_dQ(g?qNNA} zNTRFKayeqUa>iNmNrKY|2DwlssHOxv=)s?wg|7*`VVP7GNtyJf2OMs(gz(5}TQ0Gc z%1$Zt>kv1oh2YSxVn{F!q5)R)ZxD9PZJV!@4w)Yi$|TnejIBNo;4+*t%(?M<2Cd^c zdhmE=&?~>&%M-i$r=w3}FhvJcwufaUvq8HtjO*ZiOg#hKfV4h@M;YyG^#1zKvDlZW zYkbzkpW58p@9LL7W8IZ8L6f7T_jhW1*1J{YK_W%{Vtj0XBN0CBQGU|L49guhH^OWs zKb_!$hA)e1iGn{DY)s_@murZ%2VI_*aBEmzq{yaqkGW?+5I2my-7MaW^%mh8;5P^z zVO3XyXNYhhS^z~L2HR=U(X~VFrUwW;adjB%qR0(f+OS4=Q#{kV@!*a2roY`rCI$_+ zmQ5fy)H0rWY-Isi@++Mg?@}9G)jcuL^kdl<;z-NGf-CKV=Fs5>FYcJ9G>wA!Ok50g zL6@!+;z4j89*AJXeE7wHD@G^|Z$CnKJz|9;#1zMAMEIFsXHIboEt8ZW*N{i4-Z0xn z*$^?imVnP#(OV#yxG4h#@~Sj&k|`|^4Yk`lTei=fV4vhWu`^{}n9=@tl09nJjEPc| zq7^b9La<}2ow0bgOQQfdca@~+x>{ziV~h4P={enH|5&WQklwf^%aV#kl5}4RE0{P= zLu}?i5?+FJRC3a%38ahja;MD}%QyYNhP^=EvxmH_H>g>^56)yk{(u{n+U)#JZQ(!- z;XV!F{B_e5jbI!=D0^v&wKmkIMvt*jsCnmA45QNn@=Ggk1K2O9fQSt`B&x+c9KmQq zHn<|uY3SsBleR)6&CiQekFT+4G}1dJ)Fi7YF-~6wkqU3cIv!t^*>%o|J`toCpF_16 zGEPC34r==SN}~~kdCXJmBzJ?RkL|XXxW)j_vUK6Pj~{W2>y6YGv>Hxi^Zk5cMLFY&dd(R8RB-a@$>7Ufl6HPpdIZDaEYRrbr82 zlp8`Zw1TJghv`~&BLS`FRq4|t&Tdahf`_W0uTKlvC8xUMmJOFXk?m%;%Xk7rN968; z`ne6YMd~@;@w4d#|VE&kFb|m9D=WX3jSv+Bv`lgJO+H(zod<^*kl0(jcxt zeHRs;9(6vN)wR^_*Q(bk_psZOX;seV z!wVmQhs(}u<2Lx=;=~}%S!LX)W?lWJokQA}?)VdYa$SG>@cFh#u_M`u0b)Rz9u^@J zAX2W#FqQn>%RlQQXWwb!|&c#i~c+5pQ!TD<#97UEg{f&6iwi z94|C8q#mnvXGii>Ijw&CHJy&NtJlzxqlSfErsB544N#t?XvufcHgV)_&`*u;wg6@v zPB)nZzVE$;L)HeAE%f0WN^QFqwAxiEy5paYLp&TkW)5w2X+PSaDxUl6mcu)RWLvkB z`iglWuK0|tN{YDKr!q9FG}CKLtEDeAnpDnu&p_o3-f~lub^8;qNv_M?URcv@!8OoQ zTqLZ@;U&rut~XtORb9BCfw#slW=}nxU_D`OP-}OZmb~5Za-qTQU2@Mxw%d?Wl{w#- zcIk-p-9R+9L*fR98n93g1%y+O!OdB>8EUCBd@}xA{_Omq2jR>nS%o0#gT;e8V^FSk z^Q%RY@O<(uXIB%1B0|)zP+huQxg~9QEIDCsrV4L<}k-$Ge)iA|?6qGvO8}n2XPMO^AY>_pT?2vI}nBcNFN6#9#A?;w5_$ zx>N0>ZBtUGvfCVXCRU{B#u^kIBEC^ctmu>eCR}_?ZB27CsT7?vB_8%|_Q~sKxcPoq_wcBgM(ISFZHR@euN7y}Z8eDQZ(16go9rZn}gr1*sGnxDE6Y zufA@Gha+Bl^D0s{YcL))X#{z z*S55n$=@oP%bc?-q&OE!81>S#_0mo7ZS_K0WQFx7T@NG^I#5rypIxgC2!H?H&PW;m zzJ(p`+Z*DRJ?wG+g*Uv-m?yaj^#1FkBGQI!?*;^z_o4mPb&?qFkvaWOZi5E=pA6$P zD+=>U0!22jhp#1L*_8}(`b{+a4f(V7S_>1HR>5e$Q*)#=6Ei!>4$@N>KC4c`vQ`wQ z0L&?6a%ytkmT!#^Y(_`h+D1n?)C4gar-{8$K7PnXrQ)Itfn6Zvgt5qQEa`5YDkBvw zIQ2KM!w%!h+m-X~bu5&SxlZzgn#FT>Y^I%2WoU4@1-n{}N*39t7+_g`Y?bpIuPyyh zFD&$3h?`nZ%+}4h-vzW8&#KAQBXIUa^o+3ZGunn~YDrqeGt6R)EehO|+S z7kO? zvoAlMSg?);tAux5X2D6GG%{5nHn1owW@&UsQ1 z-(r_i^-H0@{l?AK>p;KxgIKhHDn-AG){^WJLMa0dHTm;-@$}Y(CUvANOc*L zH)@L+om576!D_~JCsnKlJo)VJzSu)@^^#Xh(;ag<3A^M^h#4BcF5&*ZJTMKASoF_` zJtySsF3ZL_BI_iWdxUw8`z_9uKqj3Sad9ObKbmX_uji40~I6BNQ;W8#L znIOdFP=}v8{xH=2NP`1?*T1gcE4q}Ym{OfG>Pa4p_5t;tIWG40>l9`m9i>VX6 zjHS5+5H0e57MgN%Z~+7V{thH!14d7B0;QRMV2OYMksRE>R5oDg+TY4ffop*klAOR= z)c+b$#L3D9%%tW3N-XrOz}#A(90Clt2C6Qs3`~EJIl%BzVD>WbfdeRz{1M536Wc$D zMl63(O8!<%_b09N-_`j2i?H?=%H;3D+P~|8|CgE?H!!)5i=Bn#54?v3$ZpaG27~@* z7Xh;;88|qAv4W!31Ok{o}>|)Sv!dmS=+$d&>+pYp=|B~ z@_b%(%G_HTd)>OcARPiqX)CE3Jj?QG_LSP-5F+l>Ll1g174yB39^@@zf&3BP&D<1f z9rgJT-OH9@*;n@&=+klD;wpgYg+9u4i22Ic-xY-&XttWCTvt8d7LnN#_iK`Pp1URr z*AksUPV%;2Mp6qS_{$4kFe=+`{VwWC!_Fqc753%^;}ne;_87|Aa@a?O-r|4~FaeCq zzKCsJgz7)t$2XI#Z7=<_%yo^59>C>pJ-hz(BK!-Z^Z%*l^xuuc|FK;3 zSBdsN*PH%z{{BfW`db<7Kjb17POkr3h7v1~JoWbze5UQKpt6MhG1cboez4PDf68Fs zK?mCb%Yf*PiGc(vCghS5{>kSO2^3V50CYbOCNX@mg{@4=ilt7rVlLe+Q3eG!Nh)(< zaCumicM@x)%#y8z+WYO;W1Rr(%L|Q~ z8CQoK#{EkkczX?N!w3sm{~y5-HeO}^=HQ?C1HjVY^#SUU}W8Y|v_L;L^(V+n2N ziUXZV@>BD@dfrQ6U{a5|!CLfLVcdCN!tWz?Dq2=lBLDuSwb|DNTzwnR={Im9J4^Q) zNqr6Mvcao7E`hv~whnr)=`Lg;p%*C${fpk*4HH3w{Oqiifdmhh@f-ovk`56_!Q~zaWlX}_?OWP7vlhu{j?<113yz<^rIMP=90y3 zlaW8NiGC4Fku1Zi-J=+zp&8qDl?M(8Gf|^=vCZ^Q5+JsxYe{W`Rc>V$9?eLc0iTZA-t89xF>v!EpH-wP?lj1QXfQK&V zj013)Z=iZ;b)X26(4uoKCrm{qOtXkD35H#oE`+haaS;Hy$Yec8RO#M}TqNhvg-GQZ#mibc5Aie5r-)$+s~`wV zQsuW*C1_=UUgkn{$8^jIRsdUNQ{H4&Ep*OvF1l6SMm&Gk^11K@uVZMs# zCfJMJ`bO-{Ylf(c8H(5Qk0Hm{Fzypn!}W;bjxLl_r@dDbaWZM)o3csPa+Q?1?|LS@ zQ4Oyy)Z zZ+AW8kWGDC`j%=Rcb(I=V72mnoYnl5>Z~UBl=b~6ZF1}t^%QN3dc5ac?u`or?Borh z>JwZVb0U-eaxcRX2x4}a&IDNW)op`v4~jf5@5yPQGTt~=3~S=0k46HTvn0)CmSj`| zKT;5i)8!x&b;G_62~AtbDC#~P$xlsDp;1?)kaS1%MRij4dVTiU}VWVBFzZ zX}rFPklHOSrOiPkBQRuXrrIo~?jNqRj@w$>pWdxq;Q3*l6(sUkkt{_$34(uAP5(HUGCN_ntW>La_f@x+ z(6S9PcGdeOdK@*<-oQJDzeuxMXKvzBBGAc8;&Zm6x3x2DVO(N|aQ>;`gK3p8L;xy? zL)(RFtkh84IF>-b^|lJp%df%frFe7rKt1vTAZ>AsIuo1qgN2qz zJ1c%&dMi)zl`|qC`}ec)QpXs;f3&^VG#$s+Fb40NfHA4#dWUXqr7Ki5J1DMMR_8Fb zbR${$%JTvI&-!nZq8YrqzR&6HqywHCmI&kJ6W6hAajxT4c5|Ori18zsI^T6JcGwl4 zr!GtLWzjeL#2Qrm4YcSyD$?rt#|s)v)8TQlB2^^Kt*s*qnw$9obvRQ~Gm41JB080E z@M??{BOEO(uqey0{N!Jf_3}P>%TmeK=DxVL`g)Olx9Aul`4)*vf*cxnq>nDo*Q1FP z@rXblPuIh%xf-tYE^;JmmXt79P98RD9M!C@NZ>VOLyS={Gx!N5b-`+`4NwtYXf7%& z2ANHw3Wh#PG$~{4E*)Qx+i)M}SqRHN?sf&{i`ejtx6;7+WvDa}JOaWb|A!ux|84d= z_`v}bA5*0^TN6)SM$nneJ8 z5QHq7CLCzrVE2Q0b5P+NYR?6he?e&aVv zQqJiujsO!kGh0pZAs%g>NvB^9d^a7`af!Gc9EhqVPfk(ST?cVrAKtpxG0eYeE$Fzr z>EyAtc%9?Q^4}*&vI;nloNS~(+?^>7yLB;>a!+Mj#7y0@#P4wOiG9>n8i|k3ykN{S z`TZEqERGdeDRFHLj^B=eUSZ&do4E?i`a;R4#MSNhFv#^TR%de(TQoo}NJw!Z39GKU zsG77F$VkpZcY%V`N78!hIIkka@5STedvpgyIiIHX$+p!j$drliVw}Y3CU*FB9oi}R zc$f-RZ*WB_a3ye_O?kpa%;V~y>!GwMFF7ov%=;c6SHC75p9VTl%XO>k4ToOsOXH6_ z8CY&C&9s_@DMpsB_@#BMW;6Yz0I^W<>%w^>9St;e-A1Y~zG1#oq4>u#e9{q|%i1ZU z1{r+OcuFKr9BsE|y{i5EO1i|^l`bBw#!4y%{g#7nadWM)df;~fT}GygTJfg5DKV`tgb8*-*5?r^_ zTzrjVjPNaOWvXH$?xyp25k2v}A#I}1YsdVphJCkzjBJBXl|V7;zt_Rx_>}@RvV@9u z99<(Rwg|ZeMMu;I2Tv=t2T0qUH$IW2Nm^3*AYIHm|twd{Ip>^*zn%=T=tS3_{ayhhj0t7e7U^9ObJYL^bxZKzikj%ZYT z#rfvndkto0X}*|b2pIKs-E|P!X=o%5ygLl_7=TR8Ffu8Jf&xnPY-A`1S|gW}lQlYj zj{q?1Mn@eTM@Q@YvpOaBG|*HH(clYoBbD{$+g3!(lNpj|YbQ0P_wL}0@1mWCalWn_ zPa^*)ZI6MVjqRJUF72vQ<`Er}u&yYQuhnSLYM0v^Q?jLY#&;7#oD|`I=Dq!SJ=(i^ zU#Dh|fQr+gme6c+(}<;GoFbUXknHa8Odn<4Xt>LYg+^@y1+VNGeai-qzT^SMt)xLs-q5pMqRf z&`5%O*QTbqj^*o$6lcim$lR|{JBk^rQ;eT4kYKym<+uC~bt1hr>vm^p!4ceo`axRXd!# z2A7rt1qUSukKlJMN<_7VvJf>IFC{#|->`AS*WT&R!5W~5{S6L~0%0|g;B6X*U+Y8p zq&5?u&|Rk?8nf;4YJ6a8W-CN873kM%E~!H=KC6e&=Hs`)tuP9Z2t>a&c%&r#H@6#q zc~xi--622Y$2lPxg-2ymnLvX66Gw|&Z3BTfq;Z!{qe~vB8&lo4(-!M74O%wno?%)X zM&n$4zi#{yZQ`UuVXim4-vFk7OO_Ya8N}%ei15lInu&rpkCfid^fxlScd;?H5L5** zLW7=)-nO^E#LmLxcoDLD`jW_~QyJ)DjP3v5x5plk7s1^Ru&P6<$bX&EvHS)1{g*l2 zzt>g7{|_tDe-i@zUt_%3IsQpc`M>z>KQb`JJ>Nc&x~3 zH#!5uS+hI0e^k6IxG5+lAdC@AZNr(V>qme}9WQ$o!}MokTe!?44%1!0MXE{SDXNW~7%#cYJ2o&$+kR7UP1|)5s2>ZoaC;**JSeAr zKJN+BYy5Tn00kaifbnmx_P?2H{(g1*?-Bkl(6Imds`wwvIDgp%|5?WQYcTv>#`()) z_n)KVA2JTma>fn(toUzbI-nlN@^>BQvz7ls3wBBH_vWiQJYUkx}F!`s!fb)KulgVA0=#$u}BZhvOXv~RD zdDUMb0naaI=Q$rouD&f^zqRGnRn^ti`S0d$RMaVf+6}mHNMay+6F8hT+ymHjC{~Bh z_N8G#^`=7$p^yi5Kr$j8dvVT{`!!9WHglKBa_R1@>xz9&Q~zo43@MbUuT)jo>QX@JPJQ&+}5s_q;hn*FXIx zwv2hixyE9Swz(IPor?9D{E43$KIlN!7~Fbp%;mFPMzhznzE$_}pzASN?%-`0!e*mR zfbYOk>M||N&BI?%?ogMdvvzp;)q^Y&`3gwqu-gC5T=)Ir2J-1Uc$y#7Y2U3-9|Bpr zC{9MgI+(r)`Z^5DFs%Zdah)aMKqpG}jTwmKVI7PA;Le>>&Y%LIrq>;}r$cmynbNd1 zbObApmSDEfGifUHa$oFbD*Uq1Q`ubD<9XisNcizp>V`4oGLl93y2_XPD7%7kwfsHr z*Zd8@TX2HbU`Kku+y2dN@5=HsVA8`1&{{x5M_Ey~=w(@@5;kOFm3K+W70+{v!hS3| zmRY({AT5C(4u{JFrvmuVA>l>O9F#ojE15BdLlsGnoRn=sAGtn!ZY-xO(wAOdk<~=y>=sTC!Jmg|B*+Inzb$M4k{QZ{CQcj|2qPrP807gA zgayfw2|LCEyG;nEv!#Klg)Qt1d4vLG*D*) z#rq6%Q_da~~)VD*Ou1s*^M(`S&qfD@eS(%(qJMx4VRsP<+YfbhK9v%Bt zf|+BW9|dzB1%v`ky>0mld!MHePs^|_$eA(EM3dy$ng=S&ZkX)NWm3kk75Clxebe+! zgQ{u?&Vw>`L~QOrmruG{Dbo^zJN3i5R3eXpYw>Xm_)g$!DNCF?K^+yY>FHu;xJT&~ zg5PCgup|B8p1p2S6ZMJYSCiP&jCl^z;<)Vs8a%3TnU*jnnjoBQ``T5FY#4932vD~! zU%`fDM_P~h!jpN{z~IxY`552meLiDbhw(G!uLq`2C+5R6?+2mD_I;jHZVZrLCKrp& zx|ZA?(ZQ+u^7$L=A#tiq&`pB9cmZBo)X^jsEABGjG_G?NzReV+xIS%#i4cQWUUsNa z*a37{exMVRBrFg5EpoR1r@AupJ4qp>;pwP3XV4XRx@1k29)Z7ANAiZvqs2l;_C^;~NLo z@UZgyF(KQd6l_}>p z>{?K_-no4yy(Z-5J`4{6KCYt;(A2z7dSOcDe8ZK!SKKH?ity_)K2#@BI|RvJAA0R3 zcoC`t&bBEw_swguzC+jSs7m*Ot#HkT@0Iq%Wu|mO7u|aAE+_<|yoscJ(Mr4m<{EPooU%wVbial@W*lu%$&=YB=!xZ1iVN3&v;yW&#v3|#MT@#1bJV9cHnL)l zB(QX`&Fv8?I(l(zGfJ28wcJI@iE+wi!$A)R3UMceFsbGk-GdGz8y$-5CGS-ajI(|* zOtAN5P(EsuiRJs@+{!J3A;FYps7|?@a9b;w-O%h7xnq6Gk7I%zfh)x;Z(TJb|Jf*h zl;AZ*%vb)p?W8a%*0!iqQo`AH7m}_lKcaOy0lID)`Ti0CDDrpLODZ2(yh2KB;VFu_ zQBxD_wuE(YwuvgR{i`dtjGFSY9k2?_?yuB}zG@B9kvJzm867Zz-8?|Q27QY0 zk$M;IF5x;>#Gfog{t+vYJXL@>mvM~mf=Ey^-7{kk5&w;TF!Wp`WtwPWSc@K2ZSSh} zvKxT;5FurAq+}WE($c8srQ)TBvg%v^lZWP;)7BS(V<4;42oXVTXot3=ic zO$~JqK@2JAXXZ=HSA>gPF_MXi1|N#t72DO_rQD^Q{d7!zOq!+W9%xrqt^45K7QQY) zz!3ip_W*al>RQhi)#-@!l8etVQL9P;@OBaMb&3H0aWdW z`|m@GQ{;M&c=21?QiP3;YEd->MG9FuDX*+f?wHB7Eq!fFSP0w7eu3^>%F8gOk$Eo4 zP5}XKA-4oEk^;$a$fPpz+40{8lrID5`pCHBeAmC~4IOo%70)J&KK0KJ!r6r5)}pJ} zR7ESiS5Ci4i}%O#?x&y8p=BsiSQ(-}*8$$>5Z;h(lcwXJx5g5ODdMG#4P$TdGQ-~) z3NQE%^mrS6Y9Yt93%oyh$2hu?%M7=6c&s`*AkL!l%s@WzB%^)=qh=_6w{Rt#_!6)q zi72EW{xH#7OZaTM&%JLz@5?=_zW0_|=W)wUx9{rn>AQg!yIyLrqdMu?h!=pVF)#j= z*7imJ;m`eJ;~12DuV=eZA}L2oNRP`=t_FbjzVz0L`T=Ka^}$^5Qoi6jRr-6QqTXEW z;ktg-j(kWr`tu&dlkT-q8~4nqBp2GmXOm}Nz4*0*35R9$j0GbOY&CT*TNzl=Rb5nOI+4##eHrJwRhh55*{WM8Ez(@H`vKcphJ zyp%}?7ry1ZIx=i+^bz?^QePd_7P^IC{}xHE=CBdsSn?Ai^paP}Qi!&ca%;0|Z_qKV zb%s@Kt1N}_hs8(PaK6a02^+DcNcjS4Rzsx6Gm@Nwylssv+AT(Sd>AjP0j0lI z-QVUhyULQU$BQ`7mTsGiF@mdQi7LI4F6S6)NKJp795A{ihNDNY@$SLsPJ&utyf{!_8yWKxbU5Q zl3HM`L96Yz@LPx_=y58#Dr7TZKMM<10(Ihxsg4hMY3awpOK*F$mOnoo_4#5}5hc5r zV=DAMm#rT1}!q5+C^La=`J-=IeEkxmwJ& z*GSo-pRvMYpbFl+;4%vf1rh3(k#F)8AxonvVCD110YTL1MgCJtD_1zMkY9xmh_%w(GgcJ)A~|pV0J`*oCGiMW!ce)ne{vC83_7T7aMQ zwuX5#O6?6b+75eP+Us_mkzh6;I7Ft|^e9_%(fQF`%CJ-&Y^EYpHoLwc1wyM3F+qro zW`S8YEK9%OSSAvHL4^P?Z*#wkAlfyrN?)Awrul*3&RhsFP9t7= z#CyQs2yVltPXK;=n*)2g&kV}|UWJ%$oHtS6k!%INBYCBF2bWH_r2Fjt1X$fBcgF&M zxUAb0X`JCq@Ji~ARP_dOmg-$_DR+mcNs=>2_|mEScNlC-YMOmB;_=W2vc==PlzxT@ zC{UQR9Js+Y!EQE}W9PX&?;JYtHCEfhY`|6ls25EbH$53cW)LN|Li`ZC@ReS^twPZQ z)C=^(yV3cbu=9fiWb{QpSe|_qg7m}$@w&3RXTw@7OT1T&-b8#iZsTvcFAbtEihtc) znm*GZ>gW4!@4#X~GW#S5tYN?j>!TKf>lGN38fe5EqrANx;z>}gEXlbWtc4;)&!`s= zhWU{^;{y8t;l~CC`F^iRb_k|o1;Px+V@x<=f0vhndDy&$zez7sutp8*H<4CeANQE@ zI`)fq%&PU0aVw@I2ptU-o06l%!28%&}hA`VjuB{-u!N)lkxhD{0j?6#WH=~@JR zz%0Q*AGZrj``E~)D7r3%0Wv{v0^w23#I>WVDi=iCrV8g5BXpAuCB1yY_k_X&y;+u& zMjc_TYBGA&!UMcn6iRx~SrjsQ8cWZ_+reTB;@{tsnUbgt8%@)K*D4bpk?uhtICaBB|q)v^W!qzi+ zI}10tZ8oVNpLUzinqT&t*WzXeK1@e13;!a*X2W$6*kMX(1AbxM02Ze=d!wddht9lWJZTo?n3f3+HCrIO!Ze5V$93w*;qIPTqwS)qjGT;au}y;e_0507E#rzK0p0Ym4{L( zqC*N>TmJ;=H)rt;ldCvCOGX{`fZeH!Pv)FBbu83L6k$};srYoB_cm&?obx2st4ps0 z^G*fP%iPo5h06Y)Dz*D7AhFB@$; zivgqto=;gcd(u0xOT^2o3}@O{>Er6QSXr_FZ<<-E-&`@jd0p4{tfZS zYu3@+-r&Twum<7$b=AW4!R}oeV>m?GFM|M`Y{n&n?I+RxYg?EliPdE!k442(;iw=^BBJ9y0P zhb6OPSo64FyI{!uSY1WR(wgJp)ybiy z!%-MH+A*_YA?e{T6~}pQOX2qAy19?@sQI}bw>svqL8gw3 zwxLp4YLnJWf~6(tu8a(#;B3YZDaT*&Mr^w(OR?bX$Bg0pYc!A!k7fT(9d6lVLAJ#9 z3#!zb9!qseD|YpiLUVYT;$E_N<4H)a^YIkxQfHbh=*XI3=m37`V^?3!rC>vCBwUe>x-iBi2~IC zD=I+BbBxOF7PK4gz zMK2UV;oJ5X9@N(e&^XO+kys%@*V-z+*kQ!5%t29SE#Ke`2dQ>BzkwqU>iiUsA@+m! zL=rm%0&2uOh%B88U5C3Xn2Xj<@?DtOh&!1qUdTO; zKNr^sBANI;>N5#KkY7YF_oA@>U_&mXBQ%^OK~NrEc%RVVjswLmG*3m_XtPWA3b>jxpc)f(5I>NCY2gv-ePUAgb}pd1?0BiYL!*cW)O4ackkLq~ z1LP63+q3&GwI~c4w{Ncx$@6-k#wmCEcTQSrqwnEo-v<7(%(08-&E`m;wFT!w58Z z#yU_M(XNNK!d%H(1a}~F4)6@pJJ?^td*Gc*ze6-T`GB2E*n~qNwe$r?tZ@s#oFL}} zg(uYv*zX_@ZaJ=l#*>_fj3D_V;v(gQZ4n88<0icrU^bGxgL066!2NRaL0Cn~37;J8 zx&*Tk_CY3)@PTP2>4uXhIuCOj6zu01Hr z*0MfPdSvbCZ(9y>ZetH}8e;Bh<86fr5_Nw$a)?g4Z4 zB@SxabTHn4b9dxYVo-iNWuI_IIWDI!2T3qoJ*i`-<`QRji;EznD?-1wdw<*kT2F#+ z;_BiObC7Wdez0a+c90bB1Js^UKd9gmVRz}0VV5(4vA^Y#VAs8t@XFhR@Cs{W@6zxZ zLb4Zhkjy9KQ9u3tqetfB#lKbN<3x~tPVfaL{e1<|Hh)6;wzYX{L&_~^+8BAxAoXVHuvzZUi<-E zMn-QxT=?Gvfz9OXci?V;%O1^2tf)8Lzjhh{>pOB;a$&(4~ zLNrcv5?iK{rTD`~dwzR@eMHmbKvf;O1A(EI6}?3%VfzeW=2L(3SG26n;(eXr<#UdZ%qpELCf0W zI&fqu7X87n?kJdWL4U-vIKgQjQVf(_KrXAiTcR;98Sc?Z#B848$~d?S&~gt}B2 zj=f`?B|-V4-=d^7yFSJ*qn#f=8UmJ1xY(7njUdFKfr-oZ{y( zjta46Epn!lOtonATeB6b`V6_H)^|@Hd&*Ti@OLORx%dWQvtCcD!fe;h!&yay@VVn{ zDTGt_RQyZ20RjNk5F}TwNe28#($r)%tHvFNbl4LV%QfZ!3-1iJ+qVDp;Vl;ES%M+|ak63B>Uzr(#DP|T)VS*>7FNv9&kDl{!sSpts++|?^ z<>v&DPb)P11azawWghSrii8?Nd^}PzzwhZ{S4&0 zKbcYdio_Butj#nImi|4Tu5&8Ea(ry!#ynf=o^k9BAUdJ|6V-?4@w(-L3|OeRoR@?^ z@2v%nB~MQX2+!VUaz-6EF;9hFzb>UR!)8x1Jhgs9*iZBu%dXg(U%6-nFUQYQ^|Amy zCTl*Apz$9W44>a#QnPW=1Ea*Nfqz9zjGSDIuZ*e%Y%DrA zjb_F5{4{1=((y6%jnehmJwI9zhH7~4wv|Caed%Ui5|ai8;)k?E%J+MK;#ksG*r@=$ zqUqqb-%4c=HUlccffc#E2+ZE>9aEUj==*NJM){jg^^+@3MBPUij^jp-9mSZeRC1I_ z`A-=+tr_rD6%|!g`;utd7e%%{mm2ll60R8e1KM(})$Nz65h8dY>rcQSva6rE+D=~% z+NbX=iPVxGyVO{T1f&aPE@W|f1dbY!40lK@E3AxX`e|$ZMQ7)d(!oltZWCM@u?!x~t z{moP9BfG%B!k;VYjlw;77WJ$5{X{w7I85om!cDi3ZMtEt*KR{jncqL#?klC20sEh~ zRAHn~4(=^RZTXT!WE8*bjJ%xlNe~0WjX;_Fk)VH9?jGjGEyT1I*ZHtqPYXg^iyhf) zz-SqImq$jQa?`njvl`FVh7WoHsv{-YmC@ODtIL~n&4YvDDbgamY3K)5(Lw(WY5AJbF(*Z?u>~t@GJ04B)yp1f`3xZ% zx%srw71rf0JqIrS0Q7=+9g!&%Ycy!fN{oe>qXJ(1h&$=&@N+$mx!vqrZ6T>fVqD7Y z6-IO@s(z_JlGI3)iUu5&8S58}CB^+nmKH$20Qqz_-@5of@fP_*Fm4xk7k!&PKF#m% zGY7>7&6t&m!W^EKw!@m$eckWr1*{aU6p!L&Q;Fv36y}*1KMt(NbVL~!>6vtmw2M1b z^$I$-eUr}T&RDxlZ`@T<7rr-{8@#H-P; z(s13+?fe)W%)(7uB2xL<_LDlP$E5KXX{Q&r?3nc;B&I^;w5h>urHso`R2Tpk0uC@e9EGWOW6n$vqlusWc-kAV)_1F*TJl3 z@?h+~$Eoan``zm#JJ}78ot!h*gY*q59e1Ljs$oL8GL?&ARAa|u>?+}-U}C`U24M~r zn@t&pO7pA2%o~FzmbRlHfSHX9vEn^fapuH@5%P6PsJ9035klndJ-`5l=Ir);a^Q4u zQ?4_>i*i2^K|R&rBxf#I~L6*tTukHYS*AzFz9U21=71J?M=eJDfT(eh2~8Kp*xun;xfM)@VCU z;c992(s?^v?#F|(I$Z_q`hq%@<6U)X&hqX|-cO?vF+4Y)y#(KhWH-9J6j%p64dd~` zZT36ZR%(^69c~u0cKJlCE{U6^c&bJ@rm(*Cf@!WtkP-7*2(g<(V@3ii_4r^8!SlT& z=M5fTAlQ1LkPP+N2gmx)YYa$TT+r%3uoD*+M)?o$T|RnD6HRdvM=RYZ?#l1l#88_G z7Hj7T7gvW?(2SsnHjbzOnTqRZ>Zt6=8Y&#BMm%~968e6C%n_@aFvgx&#Kod>TLEtI z<*lv8n9FB++L^Y@O?Vy-ZDu_hlJdfV*h>S^)^Hpgh2a@41};viJ{=aJUK$6EvW!Ve zSEIyqLoK}li2elh0W$8}pKX+lt;1_F9*sa9qBY1df_o-Kb~&NjwU1 zC*sXzf|w{gy}jMPy{W=`C<*ezIFZAcj#v2 zO%s|;x2pqVQ+Axf!^Z-EX}N<o z*RArB7Lw0fi@CKT>E;ac^V*p!>BkL2I@vpU4YD~WdX0DXGT7n1>#1S6H#Ns3o7VFw z8zvhjyM&hB*?%pJdeC08jcOU4J!o)Q>T!#P=0)ZC<;CXZZE|h2FTPa+LF=57?2-;l z(lcn1&_HJ>AaeD-TQr8$UK4xAy>DUH$}szr8=$()kT=fVWyKKZ zrJ+y`^>q4%=gP61eoa&nO84AvVMT^gDy&kMci(7_H7S zhOIhLTM)0QFvPZqkL3Tao6A+bVzs>S zHbtuzch$&FDZhHDENz@9;3EGuAjDX?h7dCbgFgC{sjN`KaqL>64zrBO6r7&Abieiw zV6+5ox0u(N%=nQ}b)I$^Qrqzj)8nWr%iBdVmoxSGclE>aHaOzbU-GttXKGTi6cglF z+yH#`LKCCwOD8)f`<$L4Q=~i@h+hkR#W0m<>}*h*_ezuCu}Puw7+TT}c1-T>zI9UV zb+SnUYrpj@HP!CoelMUqwful%2~4%hMTb!<|7m3FdFxoIV(%|W&C)_2+9!enSF+b8 zH%dE3r zU@R~!`M2tgf~`ien`$tQZ0w~TQPcMD*@}tx+fabyvC)o0oSV6jjbRy>JY^-@}R zUD++RkN#>)n|1N~yDHAxH~ZP#@^+V{4$HM5<+hV8JW1-57`B(9BO9x=DdJIteLA#B zL3KI4KR+(Tjc1rbsAOj@w73)Ez#?l*)+G%P11RRZ*p;JC8VZF1L{Ob=Y_RBY;c z*(C|AIN=7sx!!)(K_@H(lCOA_V({~n{?VcbZwY~IjF(_;TLpaaBz4O~9?d&@I~B+F zb(Y*VDvGk46D!zP(=`q5<$yDsc~WMcRDD3fbA+)ml7=Zo;3`Y3p}SVi;)oTgBfT_P z8mvo!|Ab}#N+@jL6{{yS_yp#f>v&83mEv3@cGq*F<)$olv*SP!)+W0S!}&|j-DTI) ztR(I)QFYTK7>bj-fwlN_MBT2|+ijHmC@m4(kN20N=#IH(F~L{uCY$vT8V<-KmZp0I zHN7Z{4Pyerk76CB?fssg(vT#%JyzzZKSwbg(3gNePn%BCVSNMjhoz88(q(cXxe56OmWbBXOX6oJ25uHk&7r}9;M2aoLu9* zp75XkE)N|}Ne~M{wqVneC5PTUI7;7*qp8#0XhBnrP}-M#NX#)G79^c<(XC}q*cs(L zn?VP>Q$qxYtIHurF{JK}!KV`(g920xwN+V0TNT zZk!6;g3Ci$*XHR*F|od<8{{>*IOLsDJve;dJNPj;1{%@SqKq%VnOWHC;AQ|PJH8Xj zK0!MOroz(EqJ-vLarvm_VY7#X$$Aj&G;WKtT9;QF%St#`tWX;?Wf^&Q*t;HtryRy4 zYEW}|KygM{!38pC#Kt+2G5I58Jj3y0h||S~=gi-Di6pA?Mr8Lm@`yH**?T1Hu8`)6 z+3ca1YRR_Q;zm%wxEOifv31J3JB5IL)UuM_iq@Ttz1)YvDo(j*7Hno^Nn=XVgit>^2cdHKwZa#|)Jw zSD79IHjX?uv}kFh7Q?(_k{apTV?Rr$9BR^pj8v|F_pTPT3`DpInT|1pL>x~slGBA# zl*P9WARrM@q6rDf<+r$VN*}#4stDXyce1O{UW?d}i-6+7ox{vqPZRxy)RdJLgZQUm zr(ev;7~mC8g1vL28&~PkNPEGpN?~` zc{t7*-$3@Du7O`38vzH4n{L&rdGK%gPM27kp&5%djkfjdK?|%uYZdP}2)PxYzxjuS9i!{#} zjx^kvV=x_(hOq7bklIxg6J29?QFi8*=tcJ-_hb?ND3*(i}SejYA zOHLd~YdZ8bCv8^QA1#VC8#h;8*OVslmOudwF#LDZF zH%JAs)AN>rR*q=ES{8@~f>W;r&?FsES9SZ9SJj@Yh$eAUNs>=H*P#9E&GAdBnY6F0 z={%V&FPFqw;#h=gQeOgFjDJ1xc+IZB*#6nItMo=F5#qYms&orluu7X41{;zRDp4GR zfeb4#&Vp{BFA&1JzoUKh&k!2;@N)o5@ou6#$wSxf_GhKJzUwt@_a+} zfiMGaw40Lw6DK&8MZb= z);T~hze@)T-i5>rq=RgtCv&Mgx^$%k91w$`YYDI$WI_jO{-BHAfte64U)ze*^~1KWM*7E&YFP9yv$ z4_sOS>;ANg*FqtEVcQGfg#Fg_qA50b(RJS6RpUekZ*ZH2B2T%6eWoH43X|C6pQ6`= zJH4IWP+;%UgLNGCE=fYA^KS>iTNmJf4?sayVx6SMw%SP!)*90#!O;G`cnQ|~W0lvH zKX|^{-5-xH9pr1vpA1Yrs0#)0{vI9FfADJuSuy=dr^h1J!cat8xHQnQS%PThkDEfk zN~LYIGVI|1Z_vFxde4v)`j_4=VPuLE9K1oCo+Laue6`AW2M?%h3aM3f!zJSHnv?2k>9)+=nG)wUKciCK z-cd#LZl5T9bp-fjp)7KirUV$?(`Rc359W6WU~piDh-On$&FQQFJ-QwYYPlvQH-7{!&`!3V(u%gFo8jFMT#{<=rGFBYDAznp2 zX6;0Q*=+YsZ+G2lx5E3-J1gHq^ znCzY&TVgQoP$;Mpz!?hXkRd%~lUjL}oC2GOG9U|PO}{Ar1)uj}LAOMq;@P58LwNuu zf`PJMGQSmR%{EhGH8E#1JUB>wuN*dRYN|r0*wMBSnct=`w7R-qJa5WLCA^?MvifnO zMXa5enNS3#LZ8Z6#Q-NYW>79b_|v!6dt&aMPKd_`tAi49C>l4Z5pSxf3h#5GM)PDS zo9sDz%7jDd`)%A$)e;i{VFGeLo^fQcml(|0FNhv=6ZFT`kDY8(a#3IW3};@_3|^c0 zeeifpDI2{4U16C|3y`v{ifX;#qda28|;8x)aW_H%^dGm;(AoH6S%)RWn3jAJjwk zZl;wIe29n;9#+rD+w9?|g5s-Wz}&M@RfC%r*!!d165~L_$sMaDddE%XN7HT)w5#b2 zy1$9t{NkY^JhOzKTNb}H<4P}~1+$prG%wWA($lfA`>k?UA7poqN} zJDni1CJGG`iPV|;c>einr>Xxwzi(zQH{{ZaOP#Noj=b0uZ&SKvMejf)3pk0;Uua(z zl3Kg*tLP7CG2;X?s{@cqN#lt&JP<&v9g+)~7a3+lNJ=Y&2PkAzZdqML8mt6APR9;X zUfB;Otz-5Ae2eBlBF%901t~J&cvq#Qbg0`hu*A`wsQi!yr)_&O-f&x-@G$#dn`xAm zEC%aowL;Y5wybI~)vZo(Mm8&AB`oy=y2w^ESMLK{u=5%TV@y!byU6E`kMS!{ZREn^$VhGq(w(k>Y8*%{YM!E#@3)2NLwWfURKYVwPHz;l4MxPGAugHG=l;0ji&x(3xCi0 zft`H84&DMCHe6{cmO&Y<(LWZ>VL%BB2o*1zv$S*g)G3z7C`wo8Q>n?gbqGOlH{zCC z4P^~pUyj5V&unAIg|j!Fhx*U%g&n@P+@17;*mfnWJw4wUyZR_#{4y z%~cQVk#A6M2liRmm3k+|FH$&9)+N?u=8jjQ+(mO5@S6Pzw&6hO_pKcw$$eI z)$IOiwm3v4(RsqheGlJd+3TYx4Yzppe})fLze>pE1Q;O0`}C4}Wi~z0k%e@+#bUkx z@V%f3mBRpgNFh|D(7BlF@i^0GA;Hns{I&3IV84UIiJ~j>*R^n3Ka_df0)z7zs4Qs| zp05;s8LDjasqZugfv|(ABP0?!@szFEn~Sf zuoj2RWK!loupa+R!1=NV1+$tSC9bWwtLU`EL0Oj|%zf6fQxz5%`jDX1IyoaCwk-De z_3X$OLi$1fxPyVN2)B}q7_;tb5OZy9P)c-DoqIqwx{*kzWqA9rbg&q(=x>yki8d$iZ*Z)ZvU5XThjK7S}*HH^oMb z_+knXeo$Ch%5Weql65$wXV*{)+2#trM661r$AXHvqQ?qOM@j;*V~bQnF5JPB@~ZrV z!{4S-KMBwW3KGtMPQh4<<9a*4MJ*AfV~JRdybJ~)rujZ@tHaV*a{KdY46Wg$1g^Ws zc;H?bq4QO|XHxmsCCn=#$?T*46kV&Ku8Pg%bU31;c$1~d1JlS59pWe@Ds0B&lbE!a z58;Qh2du;~UL(Jb1(6bU2T@qp*6nqJQK0kh=)CMak`AG-yP!g*Ut&mJSX&rmI`WE9 z0eeRJwae7wXano*mjcFryXeJusLEKB;sN-!3Dfwp!ZVDZvl+GHJuoNHt8c z$)vgMuMOjvvFW4+=7iA*r z2c6Xi-$sRMb>fD;1OWwK6^9jU%lisZtaw!U!2eO~!3Q4&u@II=2Xt zT*7;l5tRtb{P~-@13lL-i>-vRp)i4!3A=w* zV@psE4%KK#DG-ODOiqn6$>nfHCPoI?>iYoUZkq(n$v=upqNKl=qCAhka$iQDEt~KX&Pt4BYRcY&rzB4lnG-e_TjiZ#ZGLl zgQQ&gsn2f*b$A%eUIJJBKq3>Vw%xJxt5=tj`i;h&okdSd&p6goOhPm7<@td&M!pV>K1PnS|^NzRf-MrOLKYOtB0VYqxxCqPxUbdp4)Dv>Y{SuKT}=7A~nRi$#=Eij;>j zWUR*JLCPDpK1JXN%##<^yGe&&at0LF%nT&VBMB(g83dCT7dT~^!mHdtvcN^=k7p@p zw&ocZbX?YiOUufNdv!fUhh80WaohDByf#X#MO%B2*`Ifwg&qL(munhvqO)I_>sHv=6M86mvLl^bz--z7;Gl5UEqwCyDWO?2BPDJqME|^_DXD{-P9BL1U8s6^>w+H^Z< zkdXPr{B)z(FJ-2- zm$0l1C<))bYDORM5T{s`{5ys|F(W|&tbM^$pD2w|@xh34;f^GSHnHy^U${#n`Y50n zwbZ2~Lu>^0-bR8Vye7C{2a$#!#HgWOk%L;?EP#5;%0i=AXh{`d*! zYvN@F0MP?&P)FEI1PmD_qP3nN570BchhOb?5+>!`YMX$Gty7N`cXP-0w=N@xi^qg_ zsLVmH_Xx>lCmUc_>wvcj<$LBdSvGz?y(;WeZ>?$GPw|!8lr`%*~5KYFM zRJB!uEanN6Vptqm5(pefEkoO-%_V%nllq51Bx*v38Zx{5!+GOX7Ie)tPb>4#u)5t% z8dB?_1)W4X_nF=pK~+s=98c&+hemt%h0yo|ZhGIm|}=eM3^BJvQk z*;6AUcp{!kzxPP0IzZo!T?@Ak-72qgI>~jAx|z$edU2HN39Nn$IV@6w_IcO)@dJPI z(uspRj>#W_V+Z_`>U8VIY6Dlwunm3svkux36IHno{Y2uPvSllkY#EM;-4iiT_Mk*lk(BXAfjf`-d5;9wZWW?*$sApz@&&G#)&4sYC%{dd5!zFfcD z=xlMVXQSN$u9ZEh_TO<;FH22t%%W~j&Ac~FRh1irZ(tXDgUUN4AYEPXM~VBdp%}ZP z{kr_$G9JX4<+^_I)cEQyx_~D{=eR*=gb6%_P!aQFq}VSgkK zuC>m13{$Fc>a=JA(Qs5)ZkOK%26Hj>J?|>KKthy<8iUmgt&}u?VAy5M_-?BwM5O~` zWN=qBlYD$ZQKf>`Sv5@fDYs-4@f=mNUh!FCQ8n6+<6cLkA~wXq6N3~7_qMB68AP=} z#^4JzeN8=w`jy~xH`_8&l{RdhDs1b%??lHdrOdL%Z5e$vam#}#N+S_eg`zpLt#s1Z zJ1WlQSdvOKJ!bCW2a^)5m2pb7Q#|wP)Noywv|2c+m*y?J|&4U?l23?Dh+m6}sxV(S8W2fyew4@KDZF|9Ngl}l#=vkA^&9r>Wwnd+A zxvX7{@J3NMn#K;CJaZZN$uwsSOv8SfAeI(drMKLa_)VC)WIr4-DX6r0-Qa*ixUJGJxP}Gv1Hp$dnCa$6K~nA4deWY_=>dmc)a( zYP&tZl9=8TUpYaNYX>1`uQ)wc187asHm>)Jdik-XeQp<6uD@QzuXy!Dv*!EdMdtO+ zR9@vHC1|3pg-i%7Tc)$K1qh3F6MKT>hN@}TW;r*Ezw#Yw7A-f)g|zp$TzRX^MY=L4 zF-|E3`+)%RWF~?A5gRHNizw?6KENyYUXW>hr}R|luaL^= zwQ%o;6a7nfJeoB-7t}PMLI%`k&%H*lw z_;ejb7ia{W^J5W8_4^v5G|Z?aZFQb{*f`eMC)g+{B1K|~u<@DFewjHPv)O>n8}Edh z*t?jcs?O-z$KW^uS90Vh)t0h1=MVOr1%ehT$`b934l`FtoQeh*J2CA;U19L$Zj8*0?r_!m1cnU2k8A3$CG0*R zgWP6eTidie5HrfA>bYd&O8?9J$RJ4^qb=&DC9~^Cy(1v#A#Y>!WhTovNt93SZvkw8JfVrSb6Y?TVy-5YjpSvhnTI4LGpH`+7Lm zw%o2AeCL8d5((Y1N4tRJ|2sVD7iNJ-ANrhYI^8Bd-LIa~Tip;tKevXviHATx#Qg$W11t0Hi&ej~)~Iu3?bw(wLS6p0 zZm5;X2_rNCi(s@WimsOLHRb4R>~53j`R*+V76vNoK?fAi#<@Ki&C{^k+#Ad%dCv(B zlwK}BpeZL8)Zuq83sid}c%)@zRhjH1TfRpnBw$TQe%EU{@uF)9tLVssLsQr3^Ezdv zHs|bX_;dPXz1sBRZl*(kW+QQLljd1~Vj{M8 zR1FoaXG+AwdQ)IP2;X?V$f!Fv(!@L>jwQ84NW^L30D^Dz@bdeyS( zuA;Z2S5x{`HJ8=QD~&dFMQ0|@%ut&0L-1(bJ!+2?G2wIJCr(z^Gxf=?j|gyqgEGHoB^D3wQczJkHejnITIX@v#2^5< za8bKUs-lfU@vKscbFY8MtBY1M^?-A4ho|a_q85kHE&;sDYkQgF{MY2AasAG4KNF23iuanBX+EMQ54yyT0 zfPJFBKHNKL&gE$X~NA2kABj=$ewSmr7S8ln5atEAmExk zsvRFWhPPOnG=86&>40O3ae>1*h+0=AhvJYrLM6?E4Llu;ZD{nN@TBl6;?qvOO$7Sx zMd)=uGqI`FPCI9vXqKp})$X@BUp|YklabR0jJt!8gO8%VD-P-w%>cxXZVS-M#Dy zm(IKg1d*dp&2Q`7`UTDrISOMW4dIgqv*66ncV<((ExHYPm+~3L26(u|#0{e#TT_v? z3Wi=>Pn{;&@2rW@Y6UY=1^yY>Ijuacu2$k$7>vpqVFjfHUoX?gEU@tMSa|nPG+DNk zaP?dlJ27hQSFG*^ppQgT+@j#Q8KjO1lb{kO5!1rWc)X%(>FnY1c?Q}4R&Y)XP^|Z{ z2-)K>z=KmR}{H-N*$hh$(#iyZ|Mh6qyt3DpR1UPqSug^bWhZc!nu z4ehc9N*A5nC<`gx9O5j!F{(&cUN5{h3*OJHF<%RRR#@(TWc2x&o@ys>ac719>E*}? zNc~K|dhyu`tqu(;rc)ZC7sD>kUWG0BOhu^Xso86bk``0o{&5hr3AI zyl-BTE)R3huTyf@90)Hcf(26N_6=|msCL?h?Bz_x(v+7 zvpZ`~Y+Vi^-m$b-{<5kc5>Qz#?daDJMQdXO&D+sey#&1k{d}?`5Je6=zS+C)#N1a& z{OA&T@!fsoJ>-2M9cV5R-;i&r#vz&=sDz%$>V~#TY*d=cI!^z-bb2Tx#%fg3DlV0+ zy-5$v|4K|KoA*fujZ!7anz#nqEjXi#=Mp1`PlkytlUkv91oH2s;KM?ZfxS&8pbuR2E=ZVsh9RjEU-AmZ6 zSNC$ZouVM5?9r>ApWpYLI@e8hMM9-)_VG;xj`TOQ-`ZG1wNriKGOUf!270VOo0 zy|9!HJ%3{k#T=D4nLb3hNNy~Cw?Ec45#!JQ-hQXVIa##?wm}?;ozQ<PFFL!}3P~ph_nzCj0iZ~buPXc6zRFzn8P%)3CRa%Rb$&);e ztBh}(Z|JqS5qIvo*WBSY7kd%<&^?hX=qC``clR^oV^_|hD$O6i6V`!A{1d5jpD<=1 zbrI$=FRn|$ad9bx0Q=iV0GIC<+fR0U{O$q4ZOhyM8!x$;n!joc)s*yOtY~Tq=0J)h zrCgZ}v-_CUvl>*?D%2n7IDK;?NwbCZH}o$xs)ns$V+)a7MT4+yv0-5c+ByT(lJhsl zG^GkEi-UG{-o`L+uElh);h88t+VtP_lZZacHVR^UI>S&OSMP;acFn$!M2^r1jzWGXiY4gKAe#U2BN=_&J>Ty-mvRr@%c7+-abQ6S@@m!w8BA0wJdg6d z71#ge^I*19;yK{0`~KqzRps!=@xT@BP=50h&ii}X_ZyBr=CFfh^p%4=t#IN6^pky* z9+a_MhTEaB!VrAxZwsqlIl(s8R<}t=q#k1t!9LD)O44ZtEzQziy2uGn-&{_?_Zv6=FAmyXBh{RI{A8n(nBjyXi$)^Ev%u-;l2d z;L|7~P|Eu&GW{4yCNI{!@$jjQ|h zSM!4q1HqVoMB%>|J!0ShKM0W#O!xvoUT2^n$nej9Lx7uvpdiTbEq~Yl`J0>szj*rP z52qjiv#vLWKHmr7m7J!NDoetVfkeAxP|-Z`h-xTNf@J(UzD6lkN^M^c)ppWm%3(!~ z8e`O^v4)2486PeOB&1H@8NZiw_E9o{Vt^lkKN$aqklMvJWF=&YZtlzGW`&<5-%TP- zS&QtTXk#!t_`W_3^r_Re@j+E2pmL=tNXxsmBu>s1O7K(C4OEMTwFF7LyhtG0BoJH@ z)x8k(Q8o5Pe<8VZg|ydp{c=Ze6_(#3eWAS03fh1`7sZtf;-XMX+z3~FP<4uEh~ek; z=qy*RuW5D(syHHOs`Uy4XS6Y$oiiA~mdXJujK_sk6?Nha#K|M3&-{`7bVZ@D`1;M^ zl7ajYWDF{!$^h%EM0|=yqou%WBmMIw{$un~GU@%U+xf0)eVS5hL|(6uw@ z^(GEWBioIoEAULS!D0~}Z{l;NshGFWRss3SsgIB@um!EWV=?$GyN?X0s4uSP!6>M1 z(-7FC0lqi1OJq+_AtVr6EJ$NPEevZAa4*+gpR*ka4SWWZP#)+Bi~1v6;Yah25V<;w z8S;w;MD&^27m+(`B5|H=mH%RiU1-C9fZ?^P2KfEwnkm4%yldmD8x&vsTG zbhKTrB{@XU&d?w5!hW8)>hP=;kRi#u$sru zD=vpU#X4$6xhA*Oiz(;@O&2L`7Q@-qw~O`nCfbhsnx;EBpySH0eNND1yC357!UoB- z0O|Pxm!R>r{ga6ZiC!>Ke847wwBn(d_9)G)fUtSJM&_cKqE{*NMk;P5<`rt&LRkfF z5t)axS4p!{rY((glE~4}RWC^?G3MQ~WxwSxmp7zuof|+sH(sp-e@#gaC66%(Bx4ZG z20bIE6#03XLJtQF<-yAe!ywa#DLd7L=l8wQH~a^QRPPuHgg-XLlxuAKgJO;QOjJDR z7j^VE-jo%~za-UDB4!Enl4Fu%!3rUj3Ap@BXoq3%ZShkXUU2e^3xxa9A)LJQw>vop0;VL8iYj^9PwWqdafK zsT1~G)IeJ3MiMwng7S=Y6OVGH?KQJWoKm1c zG{C@T!uGg9qFNwierwql9XP2mb7z|dpNWGwyH?RQyb}g=o~$emecbr{3BUCE%xc-{ z>h`fYD9z^a9lGFzh8|GGZ9Odw7H#BFWV_p-(!4W$HidsXt#IA)xO*DUZH*2Kcz4>g zcAC$W#~V!gO%*7zgVk%L?`Ic`U(%RMS^BF{8RQ0PQLh(4-jbC{Z6v>sZQOW}sr61{ z>-`;Ku$TlGXo(i81*ucY;IRsAASS#yDpjK`z41AX2^KArr8RYc$*5%E0(WwWM0@P zwoy#i2u2BhJ_V*;)p>Kjv?X6MU6;G-F=~{vbWxRC#wVXwrOo&a2`P(&?sRINOLI;4 z-NU(_rJ4!wT^<8L`TNdihr%_PSPvcvsBdAv)Ja|?pwhTfA$}n=MoKjqVinX_95rHs zculJ*Ab;5XuEbPS0-(YalCVx-zL{zGO> zp!&&`o-gq##0rv%SKtlkhOy*mbL}jm`ZfIz1Uw*Hh@aPa5C+!QlQy#h@r-hb<{h^^ zViyl2p`E?W;my;Z_w`cwE2*JOoK)XC-G1C+ThV2{darX4M|*W*5uz(Q-~Vw*Y{V|_ zb3RWye{1~~rG2#US2E%m8CM@i5U*OcM6wr0X?~u0lg-=?af!$Lo!ACZ@~3i6vuW>- zuA+|MDff-QW$*7z33Z;5AZUeUQZWLg>usq)&vXFw(wrTL1RP+jo>{z}$tL^{(9lqy z%|cUP#IAxJWw|4n$~cT3M9aEEQU?X2n{4&EO%$_$799T1!zP9V3QafqpLl_M7Z^>4 zZ}y1>MqUlp>?+H<1rf0_1Pv-O`Zr!25#iGdVRFV$#+0zy?9usl){zqV88HF}Dj0QM z4%ElnuzHkB2P{_0zr*^;!&M$KHs}k#o^?7;fNCl3?H_i1ubTBO=lO21c;S8c=c!zM zA;H`0Gd?p}NA2nOyrF8m!Si7atx_F1aT({?Vxj|`C;IY@) zC;;=odz}z@DBhKpZK$m%>>>cq7#Gv#kCkm_Bn5L@PLD?(#Cdk4JBDtOS#5gG5f;7% zJC(cfnzZDg?fP<;r7D{$=VgiYA_*(+g!ijHH64Z5)y~@vY zPRILGzD3}jd}==RE0$VyuC8gkJ<8r2%Rs3N)5C)OF*1Ib7yfmR%!texnDR$KwaG7y z@?MJ9S62~scptqzEFNQ`smlH7#gv1_ny=2byJO0vS)8%gaRj0bV;RW%`V|<`Es^<=KtxM19x;~n*W{gns(y80a)J!<{6ewS zOi;v?2IF*#M`1Vp-^e!Shz$~IG$9ntgEn#%x|-zmK}6|RWs{e65m7Vchm@IeH8_69 zmYCE=l1qTMx-4s}dh!!V%=OHF^~AGaHs_Z%!aT)yyvDASY?0Cajb;a(7W@GxXn_CgNC@JMU-e;noZbN9K%2 z?H||Wbb&j7I~4mM+iXY~36GQ#=a&Aw!A^dVt0dIdC54Mo7AK{Qu2!ouFFnKdi|$ai`u73VJI9oPG9anzZZUJiEs<#2`XF$&1)`VPUdQ9n+3J z`Qxgko(M0ft-$SRXC#sA5ejLbrhQJ8Pt^aKlZ;e>v*Ywb%X;#e%l_i*firdrrUvE= zPIcJ$;nrz>%TD^qn|ZsiLM|z*7zHALx(7?A%*g|FeKQ z2-iUFDWCqsi~1$_g)1%cpFhu5j!O?vB2~;&lL;N35>%O?;wpm*64LC1zC*?pS`ZA> z$fZON7f47@K`ZB!YZdJaL>7zNDAPh|54ws~atWqZdiR}ISJ@q=s&a-O07q#iElzBJ za0evj*)40pGAEIWg>wxh%lQC{3CtoM2LcP1ONC3-##_z%qZ{aT=vBuT+Ir1Zw3mkK ztb5UiX1n#bIskR1iX=1n_MCn_F?`gSx+6m7&DI4nWUBukD`Az|+EiEuRujnAcaOB=E{UI69O!n2buKkjFY0fsA3Ip6U|JU!sDEuiup?wi{5^8rQQT34?uL^Y zN54D?Rpdo9C#*cD;YHRm~Is>`aE|G@MV9&0$i#2zF- z1P(s^6Ck~{XPB3{-CFp>G8se*0q#0l&X2tz$KdH<3(`%K7;DIRP~Wt0b2g*Szu&Vl z5B)b=nxvn*5nS9`r4`Dz5r9bN;;(y0Ni9 z^~!Q82%Y_Qf5c*CJWKD-4m{F0e!^hG-+M=vZd@JLx1DHffk9}xtBX!ImpFlb$+}!u zPf9|cV=-T&!!3QzG{KueP2n6ZUA!OQ5*J7tpgz(^EyDZC|86EPESgoWkeH6edS&Vw z7)T?sDen^hVQhqi%T~_@*$hgOEa5KvGa=P$Il@3S!?^V3cMWndG7Ue$Z!d?Lu*Il6 z7uiS*tky6ft{`16weF5KljyjU&XK&Ft%SDj(Hv2+hHp~+Yu9Hl>LtK*Et?0Owf0*ni zJy*?S0qGDlc!nA)HA%eaQ?GkaPOU%$QNm?<&RQM201TD5WUL>x4gjgE*)I3XV&h7N~H3&=M?yOmg%zHU`&C=)KDHwb}>Y?@_mf7ovhew7t zO^VLtO={=R)y$efS~{|xi)}viBUn9!HIFT9z^*Y3W<4K;oD&3+sj=9OZoSjWt9maM9-_huhNw#UwFsL zj${-0GT$yH$Hvaue?JrH(=eByrvtF2wWp$Yc++hjMl6akrx)7DugFaF2oYmXau5rs zN@YS_m5UIjiS(8i3&$^m|5YeUD5LXkNTAvnYq(-Osk0;UY_Zg;*s#aB1Upg=c6{8W zXp_$1S5yqR@Gm+je1P;Qnw**yb&@F(y? zCzhfPskiIFAb}*wD$;6zq8huga20E1iyC#(`NQmX$G)`0^<6;MCPRTG%ie*^yy&#fSgrLEh8vsq!)M(ut&cPGimH%M74AH$J} ztyUkB1*mL0`J3eRvyh^rxw?MctV)#6ZeiDH7ufA z4v$Ssr|jd4GV-0pi|wqxSY(;%ZGSGNc;Q|T^n3$hMfcI_rv46Ps7qdT!gG@=-4@02 zN2e*xPdYI+JueDUK?iPlLIoxUKhIIYRs2Ohd|dx%LxITo1j&0h1OGpv9RE;N{(llY zqW>g#_#Mpkt)!Ly53Dgg^OsKyVERIf|6%wT+c@FVFn-Cn>p+5c}43hs{=mGqrRTTawYW%;~{oiVdpt#UK_EvJYGiLm%lDLqPt*E$= zw7wlaow(6g6PP=>|5vo4yQ7n_wYZImEj||)or1BcxucVVJ3cwTk*$F-1r(jEgORa= zxs544`M-Aiid1yAv$Ha`{zpsx!?U4N#n+_A*JNe>a(4dd^03mf0lwPpYn2`U%OhfD zW}#(ZW&|+(L+km%j9FM%XxZ5rzY+m#_+MxaDldE$nho$ja%KDChyeep z&{y(*F-QNmLbUO}2qVpZSL;hbV)z22zs|R>UjXoB5oxm0v(YmBFXG+;Dvo9C-^B^; z?moDCkf6aC+}+(>6I=rs+y{r??he5%xI+l;1eeR+`;&dnckWr=z3Z<3rPk`|>h7uP zuBz_&G4Ipw%l{Vj`7JcjA2Ea9`ryB|{B8X$E)v@xk*C?X-g=OepZ!0=LvyqJLztpJ zLTUeR!W41y|2^)Ee&U~DiX?CSLQ_sCp+v|f#Xce^P~-ZSSc?RuQb@kVDKhKXSjeU* zRipkg(eB5((_EHgJ3Gk~;F&MnGuFCZk6Ltb$W_g$=Y!?kvurTQxTT2}8*8%Rr&B}_ zw(MrAh8;6NCM-DaV2sx0@xIR#yQ>9P&ynSLt6acaSij;q7;`xg{2;jY+hU|Pf+rsz3k&vvC{b|V&P zH}mn58Y3K2hH@B2M(rbmva6VKkB_EXYdH%R(P2B!0{;`qm-#tVAw^58Z|BTK4Pf?8iX#F1^ZGVf` z{-05dIJo)Q-k!7nE{YK^CpXXEC)0^9f|r_lh^tsa5CJ*1IKGJr z0m+Og`A1EsGEs0YvUOq*7*oQUoi7)BA}`Scne-J=td|_P+_}bp34^o8xA_i*FE{qf z)k{Zts)N^Uz{2BN%I&&lxz_8l<=OAEjvJ?W{v>o0i8raO@(VUpa^RT$29NUB2m1{q zSvnBV5plqsr?QU)&_*qCZN5U%ydHiuhF~tP$4d6poE#xOELiB2X&F`6nhn^}0B186 zPga&#l&d`Cuf^SL&F(E6cJ02uhXh`eQ?C3dFRRM7f3>IskkQq)d%8<1aQ`kqzYe5$ zBGH^|eJQhCIU<7zWUb6e2l79*>gS+vM7W@$7wYllmw{_{qC740_4|2U;26NTp$3pI zaC&H|>}@x#Q=X~u0AjzRpW3d)ngzn?4@&ZlSs!I`^quwHzf-ykKS@44WJWEi*NlcU zi>|nrWT*%=70t^R-oD|M%jJ9O>SQfmfyh89reC)_kqt;mWE6-?k@;itSmx8XQUP0c z?~Lted`!TxYf2)@JZlOX_54=v^gpS8|5cR;yAYLQfr@RKBi`M#>lRlG1y3UAVV5U9 zpSkN4NZ#0Ur^WC~U7pJS;rEqALcs6#GFzD(Ah$i~K^=q5-j{%={$1i~{^0$5XIhE! zD74D2p2h~4B7V$l*`jjSC>aKCKgKaq)de;VEt&s5WUa*t_0M-Z9yA?_%W?YR58)@S zC|L^dz1JA~;o!Z?mYh%0Ba%x}(6vRPnD9wu5KGu+<(`>B8Ml^6n~9@daBb)|J&$rDSOO${Wkst##Wa%ZmyV<>vtz}f zkjGH}BiEiK(w{82Epycrw84@wKTc1*oMu$HNv8A&&F#4@^D{Ygzl<9Xzhkc zM<3r7AS^(cM)7zgAO>0aE03uf>i5e>_)%wzVRqWQQ=4;Jb~I;oSVjwOGA#rp3aZaJ zn{;>gN+MrZy}z!t@b6j1lW_W|%|~qY>4|fOBTsx(k`r>A>IVIUoOqFGooB6a6!X)w zBP(by01A;LU~Cx+iHRS-c^XvzVlf+?Ibg8%@q*AM>Z%usv%jGZ3J1qh%?pJ@eZcY& zzg4sKz|yyM%X_Zt%I#5Tt@wSK_+-&>j9bU|QX)a5EFYu{f$7heS)mgyYkYvw9W(Dx zrtths5X>h7Y{7hG-c(Iij;Os!E5Ic#xUGmZ4|d{H*;I_14dO|#2^uIyc;b+Do-TYC z>P(fZ2;rWO_yfVkL@y=Pgf@VZ4fGQnC7bUCE-qoCpf7z-wPpl6n>CB<@{1_JdL|U{ zCtFxUclEIGb(#rJy`H12qiu8kz=zp(YvZJek*Lx4VJbkD!Tq!_XQWtRq^=kt|Hz4a z#P>~EOX;~>*aH(k2F%6#>|3XKrd=&;6T2^6t|3{JSZ;W*P4@+>BWTP8q;}*+h2V6f zDBRhx*co4+$}%OvgTAp2A$(U^oP?DZCbru|$mwqWiLAowYc?LrehKSrZ^$=?3s&YX zPN;tdxYT&&_qelz(CKk<%r&jF(rYh|qy!wI@s=fSnPS6mq8naeqD-+ya%4m%-j*o- zgBwYLS7z!g08%}_#P|Ww{9%MZONz$BtO!G8)7~itP96%9 zxr6D)cWDy9%&)4_C?|BIQab4g=?rlZ6%f8r_^v;HN5ov;Gy4_PE$8(a-Irk7>H>u= z-X)9B%h;V?;_@o=h1Ph1hXN~R>tV=R!V8j!RvC4c6&tTRCF+@kmt3Mw-M6V7zp$!y zp!klI1}4O%8c1>u;xqjcv8udmN&)f9(JKDlmqc0bUQU)5J{s8&K2+1qHM?dw2Ozvx z-bRSB8^~)v2Gup6hY;9sylC&{RdQhy%WC&roAhmUOvUf!$;iCwDn^e7z?BZXXVRL< zEP@4d4Hjhi3*CG>sskh0Dx+7W_sY>K*;~C6DzCstD9OuPEXCvXB4W@P8<@>(?OU1} z$@!(ktA^*TX|yOrgLm3wscZz%Tc{&6;agqKH&d>T(8nX< zTGYhgh3>#x_cw8lAglZd6SP5bDEPC^uBcNbr>N5g@iz@e*Za~e&T&@BjOr&r%H;ip zpu2rPfNp?*C`6#Aj?h@(qgq%aed<@yi3eAaoyCpOoxerfFC)8Ug`Ih z_ww^gQ`F*k^ zYg9&sM~$!Gu58~Y`%aVhbA9bJr&{FeltSTj9Yfn!u_^2_?cAO%GAI+aZ>i^8@Eh|> z@|mT@9cir9WMUcBr*q)RVKXdX>*vH~D&ukP3*U;m9g9 z8rax%_QNnNIL_-yJ=u+DjMGR6CRvi#wIZ7TC4QLu%#==39lgZmf%X_2ej(c_=Pj|6 zd#s-Jz%;)iGpv=bqa#jqps*~{mJ0i9S*zlKk}>+yOKM88x(R>BTBhG2`K%yhEOT(Y z|1?hQ_#$6}trVCWsuthipO|h9-6454g?3FvVvfoaHEyKD_SwA}`hCdl9+nq(U{KW- zD_|$d7o_|`_gjMMK`qK>TY@BQNVD2)!u=_bLUth_Z6FAFls$UwI-}_ zmh}2X*k3*;`s(w`P;KckVvI^(a!t}P>647N7&{2JQ2$=my@dYI$h}11LsnV(B0(2AztM-;7Kar$Fq4MW()>;*8k0{+)Wly#VN&P4{p6x)IHv z1A1Bd>!^9qo#QPAzJ24Kjz0f4Wu z_5TrIlhvy1|IuG(E%&tXsfU9oXD<09nP=2t)OpmIv1w5EQ72rhsz%uKdDWsJwmxau zq3NXI*{aIIUz>q)VR8)rJ?gEI$P012#?jITHENC|O7<(RV{wAhC^CA@gZ@s5H%IF8 z8AGKVFtdjmC>M_~jiFN23nl9#I2WUlsFyYIUg52ubCk|Db+t1e>N$ok1(d+<-=!Gu zG&)0fXW_EPi_fKTOdgjw>&f<>1$2fh&AIF2NX$$Z6_}#uW(`R5-)u$nD|+MVxVWunO~(0l&$ zk#F8bPwRYEPTZbkO=0k}jWdAidp6w0*k6-Gn-7nLK5pfjcbbRp@{huejwWZ#=V_hj z9$;kdPdcZIvwuFQ&*;oIOeOKfl0M)fzK9b$CQTn0O|n<(-YzA)JtqHo@zgDEGc}6& zZ9Ts^r)g`QFXp{7L5KV!zNJ4~{sI0*T!3u#gl4ZVv&T8^d`!Bm*@@Z%=~bLjz8CYL zYko2Omxg8ZS?OyWjTMk{Ar&ijE&cux-UF4oNl1d)NP0Ciku?{GZQdpAyf1{SvhdMl zHq>OaAlD~M>-t@!LHZ8YcK)bIwZ<(1Q*bASQWcCq&NBi~!i1Ergf~N!N`Q_cOh_Jx za?=>IO<`cZUc|JYDd{*>w}{mwu%Q9K)1U}Nr~x4U8V1a}Ug@QW(i1-Q}V;koZ82I8H!Tta^d^!Iy z)5R<;qxOE7D9+c=J=^ze37A38C9KN%61j@cK{5r9k6+{H%CPQ`vR9vjhkwEpO+jpm zMt%kmc##%Ds9NWGgJ!JIvyl%lIRQ9)sWU<10FqQ0g6=#_eXjne$S@$S6CVm}9K_2< zs$tkMuyHq#iMP>RSBHR`sJ)S&Nej}zRK;;Z z)rZZL)7)V$Ot*k|mEa7%+9$kXTs2*QvbDyoR^0YWN6`~?9eZxpEe~Fp%?U!HSr@$u z;#EOeM|A}2Y*I%4=Gu7rggXnhIqpW{grJYsF1cM%kKPP&U=t}8nN{ds3Cfw~(1B^s zIt)gs$8XMbfLo`yP;7okUXwMv6Wa5fU&hUhZMP@23CyPNwPUycHQMImwZJ*_rbGMJ zPROT-b(jEo!EuiViS6Qgq{R;>-IG?l=dM00tCEHvpAv5%Zf6ZPHLqFDZ6i0Pe1GX) zGoL^QNS|d0UWD91cm)Z=kQT%Ty%xj=hwo!;8b4rr!Q9biw~};|9dKTuJVbUvyf9q= z{1Ki)Z=eGUtAbv^RpSc>`2NsOv7NA_#b-fu`@TkW=VV?g#1L?<4=pYaN*u+n)UFRo z`YsRgZ>x(m#joV94`^?zZy83~Z2b4k0Eu7MR2;=*2Z^(2qnQC8e_e~el@j@%zlcdtH@9H!AbHICRCUaWHH>d4i2qf<&7EDwW@j-h;d`JA1&@fe$SPR&e%S9vY!un~UQ!aWPd+)?^k zD2sJ??C%u{@xtFr&*P0&Dam+f%jkgO@1oXF*ADv(`yM4YkQMn#d9-T4Y@o(t6!&#C z9Es#FNk-cUiV^O5BpWdti7q%-ZSim@ZU(SVEkCt9@@s(^4M6D=4uYE~p7?^e=Lcpk zyk^9=BS9MZ_T0|q4VNL4dHk1RNkgTiBT3=(iR|y)mO=0tBrf)(HgU(hE_?i-$5QN( zVdX&}5h#DfSF|mhZ&l8ZKztW7nJZkXnfTl=E;ohh%PxK`#`m8ML<~<34G+HGXw!HSOqx5U;_0l^foks@@ z=ZR;;`TO3%ynatpHqqxTE-CYW9UiCHs>Ja&9x;=5%vS{l21N6FGNAWuKy{TrzDn(j#1Kx^+vOUy@|^RkGn$y7$q3BnGtH zFP~UxNE;@(ijk)%n{q`47tVDI!MI6yBRNK-H&~g3);ZPK1DcPu5_F7yy6zQ8Rhx{f zHQJ|Uo?*TfiD{W>2`w7aUwJgtLUL%QHApT*K|hPGy)WFxR8D zLM#;!#@Mix^^_$4mBHofaFp%tyDRscf7*iWLkiR6XgBiuqmYD*QH6(GWd`~LM3kb( zFHHO^GXlx}QF_b5h>&^l9oSYAx8V9v-U>}-%{@+^w~}Mz**JQ>!%(Sm{F!0J$Pd4j z{>Y|!{!BFD@PDQhWRka}&p~X&*XK`K;1`iTa3zpPh#X2Gz}>gZuVye zk57{LR(i|)K75_Yz9j^lq{3)$c1U>&zUF z6`M=`8X$+24>CZ=LehuTM_WT}7@lF-FIN5WveigRnHAO^;_1?G-cOa)I-m#~E8rs7jZ9a_J6&vj~Syl-$q z#MnV5hFQnm=$21?TOhDy_(2z2dsEm^pK9S?<+T@*ltY>DMysO`0 zOL>Gt4Qu(q>r|YKH^D-ofb(M*Qa8*SNpQGWA$Ub1$AeTp-O(uOe2~{OIcEMU72a_< z9UwOk@%m9QhX=Q)ONofN{e(-|?tPs~81f_(j)t|AXt++AwD~FN@`n@Q6Nvo{Q)B1% z>kGPSsrtjrc2R z5{_qCJ~|{&;My+OI@ss(=xi{|r%2sDj*l!dXawoKOwZPImJTy-#~3Eg_4>4`+K1aS z+NCUC+MC)d>IUkH=z^J-NzFYMsg8|rl-t%E8p=H!=zQIxm$nqK0#9)4lL8$q)nUtO zk2j$Pawgf|m!)RS4wzl5$a=|W3p27W7pV?&t?}vnvNO)ZDkj9W6y^lWmYBJ8vNKc^ z3|J^~)XvBv>mC$l(+-|8NLTcvG_a)~TN@XZ=%kasYy@KE7kbjxW12e4oiVW%FQ(qN z)U*Kkg{1NDvZ31{+M_ zp!eK>PH-lbcnsfVnTCIpV;eO3jz76q@zE+EXa578KN!A;?xc%e{oeYUx78Y$WE+jS zeFDr-vY;g#DD|zzE4`AJxeVzERw~MK`I?|tLyf?FqD;&*p-$P6uyu!cTu|al+0q#6 z1n|~H%UhKU*C_62%q|+($-H|OzLyh(M>ndb-nEm{+Ku~TRD&bqg3_+pRued;yOA}Q z{aP)jdi)yG^3JDnLJA%utgOvrjv3zZ%9+NFVk+JNG5G@0#QXC#GBwedJmvk_d8F36 zQmLF9@4};sV%lTgPlr6pb4f;Y6(Mj9un=Z|s?&t9tXy(ii#c-?S(p)uF-`mXF{w)J z%B0@{Z0b9o3YB9}W|)>*Sx~%ewQ4X3Tl%Ps^B3Oesc33yQsuH#gq8GvWM*WSQk0

Lu?hls2Ck2s)*%b>16o9Ger0H zwcLl*P8xOQ>=*19@$@i;$91cOyJ2XP5gv1{>!*)1kC*ea_uaU5E@H-U(`hyV;M+%o zgc{0n_7?Vh_R*;2SX*Fe1x~!m#+L@fxuUsDy?5BQqcw}~5)2?U6=+A1v^ev7Xe>D@P;@;8r`JF6YWPXpLv z^$`(5?{)9LRxx8`l>R!2OtnpyzuNm;V)motuX;X@xVW?mM&!C-;OT3q{rK}FV!$Jb ziGS_Rc)`1ls+ai}7TPxm;=c^)|81iEgH3U;-hTWW+`=s8XlM5S znsDKLV=#Ex`FOeipA#+|ye#}2{5nY9u=BETzo8eL|3tX_VfFn7 zGcfPJy5zqu^uI5hoa4`~`3J(~Uv|KM8MFUSV=n&^mv{qT-Y6Jzhc{%#29e_pY5A|w z{dXpA4i4VGTe$VV^w{*VA%~p>Ad;+zJ7X>Pk;6zyQG{3IFOhcFB>kvflyXM(ejIk# zH-aMi`TE-LI9%j!n-xngGJJ$eg*;EtyTn?6;X_=3C5bS2*zA5k|7Q2*SgmmFFLnQn zrw&W*_-!IVW3hv9W5?h-BLVf1)S^Ex$?Y0uFPh>$C9$Ob=bm7?j`H(7T9~vNaa*k> zXCbz$y*nLfv9!nS1S#LouF8ZmEf|vSKg;r3o#vpj?u#AOME2V#-+ZXkd8F+9+FD=7 zN_n|OF2tjp_?q(NbHTg$Emx(UaEZbzB%sFItbXgDH@3*!*#1Aeikb z7`oUSlQS#|?VL@<^^whkb}M48FH~NaH7sIQ)?t!c4sjQx_y4f0l9#xP%F5%6<+&4E z?z=l~ked3s$IA;RyocCLZ$A?EeL%qVo5%3U zG}ml?OSr4CZ;CV)9ayG2X=6UWP&m)hHFW7LEPs9L!CV%}e;$c!S&)(<)4Q*|fj%M2 zOgrK?Sb9E9)c%=wgO|cntD83Wb7k3aF2LsCrO`2Gk+W{U^+rT%NoUQA>-Q*Z-3$kb zt1q{&<0xT;#9oHmo}qqVwTu0wOooAP<#SaPv!!D|?Za{TvS(F}*6gR-HiVAT=Mnut zd(+49h^3Gv-;Q70j#V4lBLOF~O>d&B>Gutpz1hZU>)n;r*SL+Dix&$I)0T_k**Od6 z6W@*XR#!*C+tRtx*DzoIqtnaz$#qujpH(h1uU7fz3y2fzCo_k7Uh9X>Fd7 zewh*6X(^-HTwMm%xRp|ux~#5LuHseu4P!^^Id-kp=~bO=&jw1J@wn^BkL4LhuGp2{ zqLG#6ypGz>C&w1^hYNKp85)LeW3#KXVqYIW@Ae+GgSyP*MJwQPN93i~KJaoptLtY#&SQnewB9`N zI?k=P=l-Mjemg?>W`9k_Oha?b!GiwU)KgiGOrSHJ}M1 z-Ozp=zItez(_XxBFO#7aJeey#cPt+jS@LD4-Po;aeGRYRcewgliU6NW-AwGAc0qV;z{zanEzdK(&Rrcu+HAecT>}F zbWk7q{Nbn?+BoOOnlSc_^hpE>>SKN3H^yV%ilNrN&dIoynraba==q#8vhj)ive^`M z7R6F|Gqph}br$6EOu=#&pO3pgbBT^YS@k{V)RxEfD51~Zf|izj0sSnCPK)s?sj*?t z1ux>?L!N2ctW=EyB}FbqjRWT_>}fala;C#iHE|dqu`fNUjE|;}5S2 zdxbUJU7eL5s>Ia}LJ0;WM+P0`bG{F{(--3Rw~tlrfgd$JhjOY}_vOoPaP&pWZ~fP6 z!tK>Ig7JnPJyfL~jvPOpWzE=fwmx?@dUA=6upBjH9QxUlEhbNNf=yHE-G^BB_c1y~ z7dGlie}yz&-Fr@Ic^Z{^1inAV(|qc#9B+c(d-I&$R{cI1wf#q&4*(dvCuH$1{UQVDJQ#2yNma-$a=7S zb)1C!Kh$FPtKj6fD?`_UgSr2y8aUn<;eVkT{#!-9<>*hCDnT6+1EiL0_Y-ery z!NJnbocs-|`~$ic6La(;*JWnsU}s_Df2*3DnVpk|2^(^MQB|40;nQFxQc=%Kd) z15C4$$|mV-0c zs`pP2O6iU^|8u&tv;U2t{qO%4|D8zw7bE|_mB@ciw||nze~#8a%*nsKuJE4{nS+y! z`|V|le>a+MHv!u}K)vIB2wvFg%cuP6`W>D#S#C4h?+z3#DQxKu>`)L6j)NhV#GxQ- zu{@}cqk|%h&>?{m5~6TG$h@x*v_VXS-6%LqgUoTv@3GGOU#gdIWu z<}4=a`tI%dPV6!VefxcSQCwEYLYqGf37`rj@@@F;I&j$r|7CHmpk|I%cE*Bx8lhP zI_e9GREVD}dYB%=*11IOy1~!5kL#29I{kSJ5TEP6e! z(v2lVj&CzXYGS@{CW>sANnzIOI&o8C>YyV^0s(M^xxoNv6fqntYQoULTxTm59S9F` zbPvEGys!x{@H`^RUrM;AtB#(& z1;+|)Ii@jJb82WGp`Mr-S}^;=-c-&MT)o0MjX2fELmI>>6st}-RYB!((TeQj8Kx-d zQWoZ5l{gn`RM5U5L$jvny^=Wdmj(LsdJGr*&vs5cV0kWRJvuQvDQtLY%%2%|*1=a2 z-@TCt5pR#S4(LDWVx^IY)=1n*u2rf)@wHntx7kT|Ybv(&q+{5u(@NDUNlj62zx z#?=Jd;XE?l64GhUP)T*@T z4wu`Nt(6fSzH@JQfL18|r9R&B`m)vdv_TrahI0D*w0zU+Y=bmqK)n11tyQ?~o|V$! zbt^j>$?TTbK|C5-l633PY_`he`$-g^Qem;cCqrW1{jI{^wO%OVA7?@s$m~d+D%_m8 zjW9Qby6Ht}jS!7ej$Wj?n}YbdnSxNNhX(}p0vPp-KL#wIzKWB5998MY)zpz$wt$Fu zv`T49?Ru7gmTF!t*JoM|Syl3E!B`1_aDjw|Sb3SfrzTUueT}uOfHNQ1v(AIPC^nil`V=?xh9pouOry!!SXAqj83ygggoIuJmC$>cTfz z5?_#;{<_bFOop{&*7-njMl&_qn5$8bYA?N4O{{yN+-!ijGv(lh+!60!M334n{=!Iq zr%8q%Dr98WKEZn2u|hQQ{M~S?yfDmw-ZM{gGC=9fSuP>n@vvin^{2=YN=kd5<}IbQ zs-xE#${=bTl;*oc@9)s74z3ETDyQ71Tt68z`^i_X1HXLBGy2TVroxqX5fsTb6C*vx zRvRByV@j+i1a*^&YC24uiZCXQWOSSc`vmYoX2uw_=9n0FS<{ce{d~kxeT#UFtrM9o zRo=bJUcJY0-qO2!Nqx@H!-`-^A0n1*<-eK6ZN&`w?sE+l^UT`&-VVhFPA^+>GWh7~ zc8wRD0+Z9_zH#UH?1=dbpEbWiIio3mVG0#sd3aMks<>}|lgs0@!O(mhrv07&$7e4$ zykEH@xf#kzphf7%5B4&B;umby26aY-Hr2~!_$$Rh9XcUyOd;AgDin@LFhoq)c2dXU zsxA0Jr?uTKJ#bw*n*ZH zhv(sA_H?Xm8_^#g4M&UEzm%^NDLf zQz11SjgAR8{~H2LApQC_wU$2^T^C(<1pBkl-pC7|-k-wwXxU?84jjj2~ zAkDs#L!c7DrzDpquQwEqMV{8HH+5$=)81{9&@_(9)56tOQGq99p-9Cdt&T8h8d#!G z3RMcVyKkAj9QKIP|HN=?B=-Jgs?mowlyfM*!j=zZ;dPPF8fy6~Dn^N0KT0?AuV4t@GLn6F$)_60 z%-V_I5;uaSxuxnxWs$JuX?%$xzxZXl@j72Pze|ZS{Sp&Ft=;ZO+stYMWBnOh>_wh7 zF&QVzLk%7;?(HP5mm?0JRua}QwReqdzGvlclT^95SSEPwz3gyXV9}Rl5-xaJ)Ww?u zv)Ba?zp?s>ZzA2sqVm)iRd%L1*_)R03uY`=e48ei6Dq# zB*DE>3t!Ka5eoX80P1O;k=?>rFh%uGhMxP;mhGbDQY+IM!(YL@#1%}<X)W)zvyh433Cb;Q<|Mgjf5E}cvF_lv9wYraijqny+q7$d2S7pKx&`QT6)3} z4+?xvJz-|MUv-(hxfnM#)Xc#-fp69n&GcsU@TcJF`b{Sh1+MJCG_J!8YQSphZ0fTp zR3H{$Pd1maUPO^j+-@rhKl{tq?J+#Z8j2~Gp4ea`7&?_GVJUb94vlo8adnFl@f)yg zBCm;Uo*$CzIP3rwL+FghTw?8p-t;5=?O6-x^YACcRH6gcWTuF;8#7&BzT5ySo5@L;M9d#W7@^#HjkizfdIHxF8YhJx3;<9 z=d^F>V`Ys-&6-Q*A=&y)<`Im})Ob=ZAH*1fkyl1^J%YP%&-)Cn4K<(P-H^TC(n&v}d1sd|9O?<#YL z#&LLrwDr*D-#Nq(KN7uJhFM;m5E9gZRKq{MT>5aXmQ}HTYM?3U#6ILd`Iz+bqY&dk zT*fLNqOj|TmU78NT#c|$90MA%H^oXF**ab?;#*l1twFQSuS*DLTM~wkz~I**Lw_?i%`CjWB-7Kcc^LHKwRpMZdbCU8-mim$10ggfvF zq9H}kH77Ek9X<>>6+}qjQPm5N#^b>e1E>akk=rx?o`apDwkrXr5!-mcRonp)NoP51 zk?3tY;FCDENYr)_z#(EA9;k;mzzy_cjXIOK@C5oXMmb72t798RZ$|+-F$Yq>cVgH= z;AW;MIq+QufF)|X3Vf%B9f&bt3BIcXutaRP112K3zX2v9wpD?dxC3}8037P+kt%)}l*021R#HUZW#23Ej)v{CtBKFX**u$LTmxP-GZHoU|%O_U-T)(bkv6IV?4^yZ zD^a73%^GQv4=}(UfCILZNBstS8DJktTx0^WaRzjN@2R4=!CK5w>R>M&Y(~jxhA2A8 z8a?b$iHi_Ga@4jnkO^bJ1jvLvkPp@(kGcn^(naxuQ<2fn~5`!B*&!9e_g#AY&9EFa~453K)Ya*#MA=0?T42f$>?Q z5P_g*usk*m7=SC806>&vm&X>DWY@y}ERnz%B@Z-<=w*p=0~SP@1Oe>8A2B3r0f`a` zfG8NCmLvvi6d$lZs+Te<6_t`BF^x_cx(+*u3dVAbDY$%S>ky02)GYW4yPFgONthJ6 ziKur8YEK9PZX$Zihk>6ndh;Ok+zlfW4-&s1w2p)gr<((5nTTUVFim=e(+9dO)qCve zCQS4;24Ep93omc{J-S86sS}2Law7c85S#0k4~t&B@voqC=tFo5o>gt;%;I;J%>103 z6ffH7UAPlc7Rml_oG6wsipHE!besgiJK&7bAt~M@UMXJCg7iYt!r%f(*Jj2xmHi@r z6k3{?phup>*&9X`L*F3VAZ`>aH##eKF|E?BeU~hOmx3pWm#oCxpDfnSPo^|JBz<)O z^0S*9YMJKWU7FV3O`9gzy-~DqY3mhgicb43ZxxRga)i+9eg-Tm70;V^{z*OyCDX_m z@77PV*Lxzp{Fv$@NYL2fs7yXa2-vy_3K0EBzA6`4{IkF4C@GN$~Qy8ey zDtTZjE7I_&8}#zwKw6fUel7PJy6^~834F+&@dUjn9_Y$$D7VTU*ve`G{3Q?MWDV;d z3n6|hx5^)27Ipz!KOR(pgp057WOINIoP|iB2~`2<1ExaGlTPR$;X=3c89I<~(KSY) zDoD8C8nW<~zC-#zUzUzOE7vVkg}2ZX(4laEUziVyQx=dvV3rLBkQBHDso)h(c;q1G z^3tCa*T>Ho$dZ7T=^KD9%FE)`yoJ1g6L9_4H=?Ub)hBkQ9Mq`l6FS2q8wjpXni&N( zDlf}hV-=CQa8-3AtSJhm>6vr6a%SGky3&v5ab?Uf$#T+<=W=DK zAQf7JNb|UoX0TA$ML(Fhj0$wJc?0%Z%if>Z)!d1UEN4BSPBL5Tnw71>-f`&$O6sA6ns5>t9@ zz<_d;!-9B9Ts}au(Kif2QW??lmfYV(MAjH2Mjxt-SY%d&Eio)HyjUp*gIMq*MMboY zho}UNCQvp2CCK*#4K~?O=zzB+T6J`~96?PT!391?8j&2io)3RGBC=en5W))@?;t8S|wHfY? z^qge#EXWaZ1ELbD6HX7(5B3i895xr;iNFcroVQ!D+YmAb`UUC^`P{M_w%fa#zbUc1 zE{HQo39=Y62SOOm4~7r+4*eW*)4$s{$P{%`W~Nl*!Df8=C0ro`=L4*E}CMk+kxkpoz3HOpwX$?Gvzbg z!>G?NrBb_Ow4iUihgH6bYw(GMy^->%nx|j?n=)NFZXAkT+wtg+<=?)kS)t*bKjmTL zOz}rT66p}fuaYuPfX%91PlO6@w<>^U^$YIU_4=GT4A%z^;RK_Uy?e|^A7Sq#0_1q&Ydou*h>gp|_nDrZJS`S_cl z0~skA2`&io9rv5ZQZy&1Q>asj0LWFiCoCtVbIwh=ZV?C(C-jsAp;@(;O;m#p*G)d5^pkXB5$g8 zTX)k1#Y2)oDnbgw_(6D)os(|rcgu7mbUTakZj!vcA7L7lA4C<@7t{n14gn7d51}8V z*qssd9ONI=5rir#n2WLraSYiGxd^+6un6fza!$CZ-tE!N7-Sz*5tIU{3y}fI3dsXy z0AmNy4xxqSMOuw|PQ0nzt<%jJ#2qvjq#jfZ$@qpl(?O0xjzUzw8c;Li>!$9O=!WU`>gE&WG-Ap{n0jXg@dNr0 zq9KT|8^7DC8z9PUM4gMMjDU|?0s(>^fuIR85yi+wXG3PgX2WND_XX)Yj2Xmnkeeu> z5kxoKM@VYuM2N^Bm>?WaD5fC%ALlvNEw8FMWq*vDFBw_Lmyo9-)$PH1D%@dZ z@+k2+{qM+(rBU38S8SYF!}0?zM+mO{2|YiNARaJSa6*$s%BS}@W5&>&vzg7= zOe1W#F`9XR!kGtbrVXNpI&sVACim2yKAEqrEe<%>&~nm9)&VZ%d7qBTu;W`B-|!VTZTZs3Dv>!-r;xGUFo zcXo$FbM*Su|2_8J`$$?%WFhl%dbk$F+nJyl!m_KsX%2?)HY9Y9$=eon^2*r4q(j%jzjDt@U;d_D_xt_)0>B7vD3b=&)6{k{f9@wezE zB{RSEorUhAd+-*`tW}TaS1f7(VUq0;LLU(!V zt=NCgoHiOqKX=&U9~{5m2`G}T4XN^*@P_E^1=QUNJYwO+_5wY^*F)OTdaZUMe>SgF zvPpXB-&`Y~V4>O;c7*<{A~Tw+W93r4x)olcCM%$JuiW>USbx9uVH<0-nicy%lvdkP zmg`_utET3QiA5FKGFz?p5eTwIA*0w!N;1^;KIfw6Ji$~-TF80pej6jObw;Pf`-_>V z*3V7za9sXSf@8)uwQM}od66f8%2^qI|e_AFPgDR@&T^d<;@C;aAp9rbvOqy8W3*3XH z&D8S8>vs~3$lDP9rY!T*=;p*DNw%yN{Cyi8n=zG=v~$trO0Vh0gtx{UT+WB3aL4(A zd^DKTGkqJ-Kb=^3G{1JG*G1a9_U`u&h%E-7L%7Odkag2ZN(uIqE4`qvV?85I?Zo=1 za(hh3&d(_1{i%?~Z*@hw6}V^_%#xOJJ-FoqvQZCS?}w3bFF#dinKX|PEw5Y@a!&Y; zne2&uA0HjV-_uFVaikE*`Or@6ox|8uwT$ylE)6-d+(8VOeTZR0trhw_R=PHX97Jjh z`JMotUJ*M$QgDtm7dX1hP}mk8XTIeVTi zDru-LWE$g18_e-czN(y16Zr~K$Cg~`i{;KK)`%UpH>@zawlkK+AltX>mK*u2JKZOG zLC^*JErcX#i8tC?48?di`1*@MC%H22@KMBiu2QN?C0U3HlN2Y-P*&KaNaWlcyQUR% zjl+H;IBhRlz8mfzvW$!sB;-Rm+@%a0-8*SAn||Q(8ufU)Dclq{1$q9R!@0%?y)IB* z#M)P`5#U;>6fnZQVexw5bqpt=$sayFuG6gk{ia)2p|nB_0}@4zMINMN33*~-UImbu zNdrplw^fdD_*rRM^|#-y-y7-gYCZeM58+_p@wr>_ZR`vw8>VKX^yu*0&T<(phX~8v zH@%t;B+lY@(IAIq1%Nv5SBW)p^$tg22vlLOQFre311~H~F6_3r&qx*Or*lP<5rR|2 zso&j+_wh3>0I<-+O=kXxuIyKfr`xIv4=dZZ`uuA3oQ)peIXO4cS?Rm5+k`BClgU@C zIR2gY_LSuieFjUA4zN5@)>hba<_=IIXBP@TbAm8FE`N6gx26o~NB_a;Ygc_=HvvrP zM=F-R9-(=?6Ld^*LP4Q4l4;nV^1Ob*t;D7A^4 zwxU&EC*kwb<-Um$2n;^O+(><|!m}tvr(F|hUn=oL;#_nOc%nC%&$YbB^ zHCtwvjw{aJil~9ZrMlT@bsdvNZD!6HdLy)rQmeQ|%WtOJW0irfDc~w7f1WmPVkKn| zX{?6}N^Eg3FtRx4c|0w845iJwnz_4}7~t$^s5DnZ>7rp1J7d?-{M0H{w_hm8|_dTyv z+di_L;qT%#j$R~`WHuPtT{=$TlSMR$snP=#MvV(yB#y^t^7LUsNK9+sH2n(64A0Z+ ze+C6NP#?mvA(m#eSm;d#BxmSG$q2)SWro^~_!~BjBQ3>vS*b+pRH>ey8sE#~BByCE z64Db@xtz{a4r4<~soLGrZH5*{4iJ?&LW7Q%2zFEdlxggXrv9?nRLG$2K%1(QU{)(+ z8s_&tFp1Ll%aS}eO=O&5d7QxjQ6hC+mr%1lXW0yS`49nMNO*xQ*zqWYou~VT$*h8f zuRr6KO%E5v*K^2=Bqd+!C;4-k$CAZeE~CR(NXPs8VJne5gY_^4#brjCX>MIrLbj9r z-ONesrzm~Jc{)kxY`A!4iaTj;yyMF{!45z> zHuD1=NS=q4)0(NtP^Q`em$WaiviNFEYlz zbE2>cltFo4SB#bPD>c-z2-q6AE?%-zR8fQ`8Oq@C%l*ji#f)7|eBs`RLM;+B-^Vri^7^*C1NSZMT=O#ex>)hHRHWeaA8n<(Hzy4iZq$J+h0l z#RxRFK_U0^%bTcjC|9GEAIhK(0b6*@V9+QvZ+FKHeXQ6v(Z~cj;;?vx9W>qx@n=3) z+Y|^gc+EZrL-p^Knk2}pdSlw$j04jcEG_0;8(P~J9ek8CT65e!fA|X$Ch{e1zpR}k zK$A6=sTNX?07Xomb8b}9B?o@@MzV4vQ_JmXodkuIkV`4rmsSmVb**1MX6o<~#V51S zvc5`}yS~as;-Xh8lz5E=-A1F=rH|0A8P-uGKdR*Ihxnr8_%litw=die@$k2jdkUR5 zKVviIZc4mr*w69{ARXrj!t-_u+^pMQZ;F<;4uXc43gUDAU8bpv1KR4

Zo99vW_o!aD1JTaJBTujG| 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 literal 0 HcmV?d00001 From 17548bf61fb9249f6d8511c66e36c67d6eeb91f8 Mon Sep 17 00:00:00 2001 From: Derek Chiang Date: Fri, 11 Aug 2023 11:02:51 +0800 Subject: [PATCH 12/33] Update audit report to latest version --- audits/kalos_v2_1.pdf | Bin 2156854 -> 2157539 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/audits/kalos_v2_1.pdf b/audits/kalos_v2_1.pdf index 73d3266692f00eddc813b6d1929cddebf468db45..29d0a8ea978f1b3d3518648461e235da17d8d971 100644 GIT binary patch delta 69637 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 delta 68794 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⁣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 From fde9e99453caa1594b2d33cecdc48fb356ca0406 Mon Sep 17 00:00:00 2001 From: taek Date: Tue, 15 Aug 2023 00:58:37 +0900 Subject: [PATCH 13/33] V2.1 typed primitives (#26) * typed primitives for validation data * forge fmt * added test for proxy * fix: return address when proxy is deployed * forge fmt * cleaned up the test, should deal with weird gas limit afterward * removed comments --- gas/ecdsa/report.txt | 45 +++++++++-------- src/Kernel.sol | 38 +++++++------- src/abstract/KernelStorage.sol | 4 +- src/common/Constants.sol | 6 +-- src/common/Structs.sol | 9 ++-- src/common/Types.sol | 30 +++++++++++ src/factory/AdminLessERC1967Factory.sol | 18 +++++-- src/interfaces/IValidator.sol | 7 +-- src/test/TestValidator.sol | 9 ++-- src/utils/KernelHelper.sol | 7 +-- src/validator/ECDSAValidator.sol | 11 ++-- src/validator/ERC165SessionKeyValidator.sol | 17 ++++--- src/validator/KillSwitchValidator.sol | 47 +++++++++-------- src/validator/MultiECDSAValidator.sol | 13 ++--- src/validator/SessionKeyOwnedValidator.sol | 31 ++++++------ src/validator/SessionKeyValidator.sol | 23 ++++++--- test/foundry/Kernel.t.sol | 50 ++++++++----------- test/foundry/KernelExecution.t.sol | 27 ++-------- test/foundry/KernelHelper.t.sol | 41 +++++++-------- test/foundry/utils/ERC4337Utils.sol | 33 +++++++++++- .../validator/SessionKeyValidator.t.sol | 49 +++--------------- 21 files changed, 272 insertions(+), 243 deletions(-) create mode 100644 src/common/Types.sol diff --git a/gas/ecdsa/report.txt b/gas/ecdsa/report.txt index c557c241..c97b8dcc 100644 --- a/gas/ecdsa/report.txt +++ b/gas/ecdsa/report.txt @@ -1,39 +1,40 @@ No files changed, compilation skipped -Running 8 tests for test/foundry/Kernel.t.sol:KernelTest -[PASS] test_disable_mode() (gas: 162572) -[PASS] test_external_call_default() (gas: 28889) -[PASS] test_external_call_execution() (gas: 453074) -[PASS] test_initialize_twice() (gas: 20907) -[PASS] test_set_default_validator() (gas: 361045) -[PASS] test_set_execution() (gas: 411379) -[PASS] test_validate_signature() (gas: 163724) -[PASS] test_validate_userOp() (gas: 1704261) -Test result: ok. 8 passed; 0 failed; 0 skipped; finished in 2.89ms +Running 9 tests for test/foundry/Kernel.t.sol:KernelTest +[PASS] test_disable_mode() (gas: 162594) +[PASS] test_external_call_default() (gas: 28911) +[PASS] test_external_call_execution() (gas: 453201) +[PASS] test_initialize_twice() (gas: 20929) +[PASS] test_set_default_validator() (gas: 361067) +[PASS] test_set_execution() (gas: 411392) +[PASS] test_shoul_return_address_if_deployed() (gas: 8937393460516732963) +[PASS] test_validate_signature() (gas: 163650) +[PASS] test_validate_userOp() (gas: 1687848) +Test result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.60ms | src/Kernel.sol:Kernel contract | | | | | | |--------------------------------|-----------------|-------|--------|-------|---------| | Deployment Cost | Deployment Size | | | | | -| 1561763 | 8209 | | | | | +| 1545342 | 8127 | | | | | | Function Name | min | avg | median | max | # calls | | disableMode | 3765 | 3765 | 3765 | 3765 | 1 | | getDefaultValidator | 341 | 341 | 341 | 341 | 1 | | getDisabledMode | 577 | 577 | 577 | 577 | 1 | | getExecution | 1249 | 1249 | 1249 | 1249 | 2 | -| initialize | 3046 | 43982 | 48253 | 50753 | 10 | -| isValidSignature | 6047 | 6047 | 6047 | 6047 | 1 | +| initialize | 3046 | 44370 | 48253 | 50753 | 11 | +| isValidSignature | 5764 | 5764 | 5764 | 5764 | 1 | | setDefaultValidator | 7870 | 7870 | 7870 | 7870 | 1 | -| setExecution | 49874 | 49874 | 49874 | 49874 | 2 | +| setExecution | 49865 | 49865 | 49865 | 49865 | 2 | | validateUserOp | 45773 | 45967 | 45989 | 46119 | 4 | -| src/factory/KernelFactory.sol:KernelFactory contract | | | | | | -|------------------------------------------------------|-----------------|--------|--------|--------|---------| -| Deployment Cost | Deployment Size | | | | | -| 564969 | 2862 | | | | | -| Function Name | min | avg | median | max | # calls | -| createAccount | 130989 | 131766 | 130989 | 137989 | 9 | -| setImplementation | 22862 | 22862 | 22862 | 22862 | 8 | +| src/factory/KernelFactory.sol:KernelFactory contract | | | | | | +|------------------------------------------------------|-----------------|--------------------|--------|---------------------|---------| +| Deployment Cost | Deployment Size | | | | | +| 599207 | 3033 | | | | | +| Function Name | min | avg | median | max | # calls | +| createAccount | 131176 | 812490314592548788 | 131176 | 8937393460516717918 | 11 | +| setImplementation | 22852 | 22852 | 22852 | 22852 | 9 | -Ran 1 test suites: 8 tests passed, 0 failed, 0 skipped (8 total tests) +Ran 1 test suites: 9 tests passed, 0 failed, 0 skipped (9 total tests) diff --git a/src/Kernel.sol b/src/Kernel.sol index e3b75166..0d4fdfd2 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; // Importing external libraries and contracts import "solady/utils/EIP712.sol"; import "solady/utils/ECDSA.sol"; -import "account-abstraction/core/Helpers.sol"; import "account-abstraction/interfaces/IEntryPoint.sol"; import "./abstract/Compatibility.sol"; import "./abstract/KernelStorage.sol"; @@ -16,6 +15,7 @@ import "src/common/Enum.sol"; /// @title Kernel /// @author taek /// @notice wallet kernel for extensible wallet functionality + contract Kernel is EIP712, Compatibility, KernelStorage { string public constant name = KERNEL_NAME; @@ -59,9 +59,9 @@ contract Kernel is EIP712, Compatibility, KernelStorage { if (msg.sender != address(entryPoint) && !_checkCaller()) { revert NotAuthorizedCaller(); } - if (operation == Operation.DelegateCall) { + if (operation == Operation.Call) { assembly { - let success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0) + let success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0) returndatacopy(0, 0, returndatasize()) switch success case 0 { revert(0, returndatasize()) } @@ -69,7 +69,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { } } else { assembly { - let success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0) + let success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0) returndatacopy(0, 0, returndatasize()) switch success case 0 { revert(0, returndatasize()) } @@ -87,7 +87,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { function validateUserOp(UserOperation memory userOp, bytes32 userOpHash, uint256 missingAccountFunds) external payable - returns (uint256 validationData) + returns (ValidationData validationData) { if (msg.sender != address(entryPoint)) { revert NotEntryPoint(); @@ -129,7 +129,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { } } userOpSignature = userOpSignature[4:]; - validationData = (uint256(detail.validAfter) << 208) | (uint256(detail.validUntil) << 160); + validationData = packValidationData(detail.validAfter, detail.validUntil); } else if (mode == 0x00000002) { bytes calldata userOpCallData; assembly { @@ -159,7 +159,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { function _approveValidator(bytes4 sig, bytes calldata signature) internal - returns (IKernelValidator validator, uint256 validationData, bytes calldata validationSig) + returns (IKernelValidator validator, ValidationData validationData, bytes calldata validationSig) { unchecked { validator = IKernelValidator(address(bytes20(signature[16:36]))); @@ -188,7 +188,10 @@ contract Kernel is EIP712, Compatibility, KernelStorage { ); validationData = _intersectValidationData( getKernelStorage().defaultValidator.validateSignature(enableDigest, signature[cursor:cursor + length]), - uint256(bytes32(signature[4:36])) & 0xffffffffffffffffffffffff0000000000000000000000000000000000000000 + ValidationData.wrap( + uint256(bytes32(signature[4:36])) + & 0xffffffffffffffffffffffff0000000000000000000000000000000000000000 + ) ); assembly { cursor := add(cursor, length) @@ -196,8 +199,8 @@ contract Kernel is EIP712, Compatibility, KernelStorage { validationSig.length := sub(signature.length, cursor) } getKernelStorage().execution[sig] = ExecutionDetail({ - validAfter: uint48(bytes6(signature[4:10])), - validUntil: uint48(bytes6(signature[10:16])), + validAfter: ValidAfter.wrap(uint48(bytes6(signature[4:10]))), + validUntil: ValidUntil.wrap(uint48(bytes6(signature[10:16]))), executor: address(bytes20(signature[36:56])), validator: IKernelValidator(address(bytes20(signature[16:36]))) }); @@ -211,15 +214,15 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @param signature The signature to be validated /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4) { - uint256 validationData = getKernelStorage().defaultValidator.validateSignature(hash, signature); - ValidationData memory data = _parseValidationData(validationData); - if (data.validAfter > block.timestamp) { + ValidationData validationData = getKernelStorage().defaultValidator.validateSignature(hash, signature); + (ValidAfter validAfter, ValidUntil validUntil, address result) = parseValidationData(validationData); + if (ValidAfter.unwrap(validAfter) > block.timestamp) { return 0xffffffff; } - if (data.validUntil < block.timestamp) { + if (ValidUntil.unwrap(validUntil) < block.timestamp) { return 0xffffffff; } - if (data.aggregator != address(0)) { + if (result != address(0)) { return 0xffffffff; } @@ -233,8 +236,9 @@ contract Kernel is EIP712, Compatibility, KernelStorage { bytes4 sig = msg.sig; ExecutionDetail storage detail = getKernelStorage().execution[sig]; if ( - address(detail.validator) == address(0) || (detail.validUntil != 0 && detail.validUntil < block.timestamp) - || detail.validAfter > block.timestamp + address(detail.validator) == address(0) + || (ValidUntil.unwrap(detail.validUntil) != 0 && ValidUntil.unwrap(detail.validUntil) < block.timestamp) + || ValidAfter.unwrap(detail.validAfter) > block.timestamp ) { return false; } else { diff --git a/src/abstract/KernelStorage.sol b/src/abstract/KernelStorage.sol index 8bdc6a2f..08ca56f2 100644 --- a/src/abstract/KernelStorage.sol +++ b/src/abstract/KernelStorage.sol @@ -110,8 +110,8 @@ contract KernelStorage { getKernelStorage().execution[_selector] = ExecutionDetail({ executor: _executor, validator: _validator, - validUntil: _validUntil, - validAfter: _validAfter + validUntil: ValidUntil.wrap(_validUntil), + validAfter: ValidAfter.wrap(_validAfter) }); _validator.enable(_enableData); emit ExecutionChanged(_selector, _executor, address(_validator)); diff --git a/src/common/Constants.sol b/src/common/Constants.sol index ff2382ac..a17ca72c 100644 --- a/src/common/Constants.sol +++ b/src/common/Constants.sol @@ -1,11 +1,11 @@ pragma solidity ^0.8.0; // constants for kernel metadata -string constant KERNEL_NAME="Kernel"; -string constant KERNEL_VERSION="0.2.1"; +string constant KERNEL_NAME = "Kernel"; +string constant KERNEL_VERSION = "0.2.1"; // ERC4337 constants -uint256 constant SIG_VALIDATION_FAILED = 1; +uint256 constant SIG_VALIDATION_FAILED_UINT = 1; // STRUCT_HASH bytes32 constant VALIDATOR_APPROVED_STRUCT_HASH = 0x3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee964176; diff --git a/src/common/Structs.sol b/src/common/Structs.sol index 7277bdbd..f728400d 100644 --- a/src/common/Structs.sol +++ b/src/common/Structs.sol @@ -2,11 +2,12 @@ pragma solidity ^0.8.0; import "src/interfaces/IValidator.sol"; import "src/common/Enum.sol"; +import "src/common/Types.sol"; // Defining a struct for execution details struct ExecutionDetail { - uint48 validAfter; // Until what time is this execution valid - uint48 validUntil; // After what time is this execution valid + ValidAfter validAfter; // Until what time is this execution valid + ValidUntil validUntil; // After what time is this execution valid address executor; // Who is the executor of this execution IKernelValidator validator; // The validator for this execution } @@ -37,8 +38,8 @@ struct Permission { struct SessionData { bytes32 merkleRoot; - uint48 validAfter; - uint48 validUntil; + ValidAfter validAfter; + ValidUntil validUntil; address paymaster; // address(0) means accept userOp without paymaster, address(1) means reject userOp with paymaster, other address means accept userOp with paymaster with the address bool enabled; } diff --git a/src/common/Types.sol b/src/common/Types.sol new file mode 100644 index 00000000..f72b7237 --- /dev/null +++ b/src/common/Types.sol @@ -0,0 +1,30 @@ +pragma solidity ^0.8.9; + +import "src/common/Constants.sol"; + +type ValidAfter is uint48; + +type ValidUntil is uint48; + +type ValidationData is uint256; + +ValidationData constant SIG_VALIDATION_FAILED = ValidationData.wrap(SIG_VALIDATION_FAILED_UINT); + +function packValidationData(ValidAfter validAfter, ValidUntil validUntil) pure returns (ValidationData) { + return ValidationData.wrap( + uint256(ValidAfter.unwrap(validAfter)) << 208 | uint256(ValidUntil.unwrap(validUntil)) << 160 + ); +} + +function parseValidationData(ValidationData validationData) + pure + returns (ValidAfter validAfter, ValidUntil validUntil, address result) +{ + assembly { + result := validationData + validUntil := and(shr(160, validationData), 0xffffffffffff) + switch iszero(validUntil) + case 1 { validUntil := 0xffffffffffff } + validAfter := shr(208, validationData) + } +} diff --git a/src/factory/AdminLessERC1967Factory.sol b/src/factory/AdminLessERC1967Factory.sol index d220e8ca..a62268ca 100644 --- a/src/factory/AdminLessERC1967Factory.sol +++ b/src/factory/AdminLessERC1967Factory.sol @@ -98,12 +98,20 @@ contract AdminLessERC1967Factory { switch useSalt case 0 { proxy := create(0, add(m, 0x13), 0x89) } default { proxy := create2(0, add(m, 0x13), 0x89, salt) } - // Revert if the creation fails. - if iszero(proxy) { - mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) - revert(0x1c, 0x04) - } + } + if (proxy == address(0)) { + proxy = predictDeterministicAddress(salt); + assembly { + if iszero(extcodesize(proxy)) { + // Revert if the creation fails. + mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) + revert(0x1c, 0x04) + } + } + return proxy; + } + assembly { // Set up the calldata to set the implementation of the proxy. mstore(m, implementation) mstore(add(m, 0x20), _IMPLEMENTATION_SLOT) diff --git a/src/interfaces/IValidator.sol b/src/interfaces/IValidator.sol index 36081f5a..691223a5 100644 --- a/src/interfaces/IValidator.sol +++ b/src/interfaces/IValidator.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "account-abstraction/interfaces/UserOperation.sol"; +import {UserOperation} from "account-abstraction/interfaces/UserOperation.sol"; +import "src/common/Types.sol"; interface IKernelValidator { function enable(bytes calldata _data) external payable; @@ -11,9 +12,9 @@ interface IKernelValidator { function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingFunds) external payable - returns (uint256); + returns (ValidationData); - function validateSignature(bytes32 hash, bytes calldata signature) external view returns (uint256); + function validateSignature(bytes32 hash, bytes calldata signature) external view returns (ValidationData); function validCaller(address caller, bytes calldata data) external view returns (bool); } diff --git a/src/test/TestValidator.sol b/src/test/TestValidator.sol index 1abe161f..1882639e 100644 --- a/src/test/TestValidator.sol +++ b/src/test/TestValidator.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; import "src/interfaces/IValidator.sol"; +import "src/common/Types.sol"; contract TestValidator is IKernelValidator { event TestValidateUserOp(bytes32 indexed opHash); @@ -14,18 +15,18 @@ contract TestValidator is IKernelValidator { caller[_kernel] = _caller; } - function validateSignature(bytes32, bytes calldata) external pure override returns (uint256) { - return 0; + function validateSignature(bytes32, bytes calldata) external pure override returns (ValidationData) { + return ValidationData.wrap(0); } function validateUserOp(UserOperation calldata, bytes32 userOpHash, uint256) external payable override - returns (uint256) + returns (ValidationData) { emit TestValidateUserOp(userOpHash); - return 0; + return ValidationData.wrap(0); } function enable(bytes calldata data) external payable override { diff --git a/src/utils/KernelHelper.sol b/src/utils/KernelHelper.sol index 5ec7d9d0..77b67d0e 100644 --- a/src/utils/KernelHelper.sol +++ b/src/utils/KernelHelper.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; +import {SIG_VALIDATION_FAILED_UINT} from "src/common/Constants.sol"; +import {ValidationData} from "src/common/Types.sol"; -function _intersectValidationData(uint256 a, uint256 b) pure returns (uint256 validationData) { +function _intersectValidationData(ValidationData a, ValidationData b) pure returns (ValidationData validationData) { assembly { // xor(a,b) == shows only matching bits // and(xor(a,b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) == filters out the validAfter and validUntil bits @@ -21,6 +22,6 @@ function _intersectValidationData(uint256 a, uint256 b) pure returns (uint256 va if iszero(until) { until := 0x000000000000ffffffffffff0000000000000000000000000000000000000000 } validationData := or(validationData, until) } - default { validationData := SIG_VALIDATION_FAILED } + default { validationData := SIG_VALIDATION_FAILED_UINT } } } diff --git a/src/validator/ECDSAValidator.sol b/src/validator/ECDSAValidator.sol index ac7385ea..da48b590 100644 --- a/src/validator/ECDSAValidator.sol +++ b/src/validator/ECDSAValidator.sol @@ -5,6 +5,7 @@ pragma solidity ^0.8.0; import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; import "src/interfaces/IValidator.sol"; +import "src/common/Types.sol"; struct ECDSAValidatorStorage { address owner; @@ -30,29 +31,29 @@ contract ECDSAValidator is IKernelValidator { external payable override - returns (uint256 validationData) + returns (ValidationData validationData) { address owner = ecdsaValidatorStorage[_userOp.sender].owner; bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); if (owner == ECDSA.recover(hash, _userOp.signature)) { - return 0; + return ValidationData.wrap(0); } if (owner != ECDSA.recover(_userOpHash, _userOp.signature)) { return SIG_VALIDATION_FAILED; } } - function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { + function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (ValidationData) { address owner = ecdsaValidatorStorage[msg.sender].owner; if (owner == ECDSA.recover(hash, signature)) { - return 0; + return ValidationData.wrap(0); } bytes32 ethHash = ECDSA.toEthSignedMessageHash(hash); address recovered = ECDSA.recover(ethHash, signature); if (owner != recovered) { return SIG_VALIDATION_FAILED; } - return 0; + return ValidationData.wrap(0); } function validCaller(address _caller, bytes calldata) external view override returns (bool) { diff --git a/src/validator/ERC165SessionKeyValidator.sol b/src/validator/ERC165SessionKeyValidator.sol index fc487d39..d0071274 100644 --- a/src/validator/ERC165SessionKeyValidator.sol +++ b/src/validator/ERC165SessionKeyValidator.sol @@ -5,14 +5,15 @@ import "openzeppelin-contracts/contracts/utils/introspection/IERC165.sol"; import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; import "src/interfaces/IValidator.sol"; +import "src/common/Types.sol"; // idea, we can make this merkle root struct ERC165SessionKeyStorage { bool enabled; bytes4 selector; bytes4 interfaceId; - uint48 validUntil; - uint48 validAfter; + ValidAfter validAfter; + ValidUntil validUntil; uint32 addressOffset; } @@ -23,11 +24,11 @@ contract ERC165SessionKeyValidator is IKernelValidator { address sessionKey = address(bytes20(_data[0:20])); bytes4 interfaceId = bytes4(_data[20:24]); bytes4 selector = bytes4(_data[24:28]); - uint48 validUntil = uint48(bytes6(_data[28:34])); - uint48 validAfter = uint48(bytes6(_data[34:40])); + ValidAfter validAfter = ValidAfter.wrap(uint48(bytes6(_data[28:34]))); + ValidUntil validUntil = ValidUntil.wrap(uint48(bytes6(_data[34:40]))); uint32 addressOffset = uint32(bytes4(_data[40:44])); sessionKeys[sessionKey][msg.sender] = - ERC165SessionKeyStorage(true, selector, interfaceId, validUntil, validAfter, addressOffset); + ERC165SessionKeyStorage(true, selector, interfaceId, validAfter, validUntil, addressOffset); } function disable(bytes calldata _data) external payable { @@ -36,14 +37,14 @@ contract ERC165SessionKeyValidator is IKernelValidator { delete sessionKeys[sessionKey][msg.sender]; } - function validateSignature(bytes32, bytes calldata) external pure override returns (uint256) { + function validateSignature(bytes32, bytes calldata) external pure override returns (ValidationData) { revert("not implemented"); } function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) external payable - returns (uint256) + returns (ValidationData) { bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); address recovered = ECDSA.recover(hash, _userOp.signature); @@ -54,7 +55,7 @@ contract ERC165SessionKeyValidator is IKernelValidator { require(bytes4(_userOp.callData[0:4]) == sessionKey.selector, "not supported selector"); address token = address(bytes20(_userOp.callData[sessionKey.addressOffset:sessionKey.addressOffset + 20])); require(IERC165(token).supportsInterface(sessionKey.interfaceId), "does not support interface"); - return (uint256(sessionKey.validAfter) << 160) | (uint256(sessionKey.validUntil) << (48 + 160)); + return packValidationData(sessionKey.validAfter, sessionKey.validUntil); } function validCaller(address, bytes calldata) external pure override returns (bool) { diff --git a/src/validator/KillSwitchValidator.sol b/src/validator/KillSwitchValidator.sol index a95c6d6c..721c0a65 100644 --- a/src/validator/KillSwitchValidator.sol +++ b/src/validator/KillSwitchValidator.sol @@ -4,15 +4,15 @@ pragma solidity ^0.8.0; import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; -import "account-abstraction/core/Helpers.sol"; import "src/Kernel.sol"; import {WalletKernelStorage, ExecutionDetail} from "src/abstract/KernelStorage.sol"; import "src/interfaces/IValidator.sol"; +import "src/common/Types.sol"; struct KillSwitchValidatorStorage { address guardian; IKernelValidator validator; - uint48 pausedUntil; + ValidAfter pausedUntil; bytes4 disableMode; } @@ -27,15 +27,20 @@ contract KillSwitchValidator is IKernelValidator { delete killSwitchValidatorStorage[msg.sender]; } - function validateSignature(bytes32 hash, bytes calldata signature) external view override returns (uint256) { + function validateSignature(bytes32 hash, bytes calldata signature) + external + view + override + returns (ValidationData) + { KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[msg.sender]; - uint256 res = validatorStorage.validator.validateSignature(hash, signature); - uint48 pausedUntil = validatorStorage.pausedUntil; - ValidationData memory validationData = _parseValidationData(res); - if (validationData.aggregator != address(1)) { + ValidationData res = validatorStorage.validator.validateSignature(hash, signature); + ValidAfter pausedUntil = validatorStorage.pausedUntil; + (,, address result) = parseValidationData(res); + if (result != address(1)) { // if signature verification has not been failed, return with the result - uint256 delayedData = _packValidationData(false, 0, pausedUntil); - return _packValidationData(_intersectTimeRange(res, delayedData)); + ValidationData delayedData = packValidationData(pausedUntil, ValidUntil.wrap(0)); + return _intersectValidationData(res, delayedData); } return SIG_VALIDATION_FAILED; } @@ -44,28 +49,28 @@ contract KillSwitchValidator is IKernelValidator { external payable override - returns (uint256) + returns (ValidationData) { KillSwitchValidatorStorage storage validatorStorage = killSwitchValidatorStorage[msg.sender]; // should use msg.sender to prevent others from changing storage - uint48 pausedUntil = validatorStorage.pausedUntil; - uint256 validationResult = 0; + ValidAfter pausedUntil = validatorStorage.pausedUntil; + ValidationData validationData; if (address(validatorStorage.validator) != address(0)) { // check for validator at first - try validatorStorage.validator.validateUserOp(_userOp, _userOpHash, pausedUntil) returns (uint256 res) { - validationResult = res; + try validatorStorage.validator.validateUserOp(_userOp, _userOpHash, 0) returns (ValidationData res) { + validationData = res; } catch { - validationResult = SIG_VALIDATION_FAILED; + validationData = SIG_VALIDATION_FAILED; } - ValidationData memory validationData = _parseValidationData(validationResult); - if (validationData.aggregator != address(1)) { + (,, address result) = parseValidationData(validationData); + if (result != address(1)) { // if signature verification has not been failed, return with the result - uint256 delayedData = _packValidationData(false, 0, pausedUntil); - return _packValidationData(_intersectTimeRange(validationResult, delayedData)); + ValidationData delayedData = packValidationData(pausedUntil, ValidUntil.wrap(0)); + return _intersectValidationData(validationData, delayedData); } } if (_userOp.signature.length == 71) { // save data to this storage - validatorStorage.pausedUntil = uint48(bytes6(_userOp.signature[0:6])); + validatorStorage.pausedUntil = ValidAfter.wrap(uint48(bytes6(_userOp.signature[0:6]))); validatorStorage.validator = KernelStorage(msg.sender).getDefaultValidator(); validatorStorage.disableMode = KernelStorage(msg.sender).getDisabledMode(); bytes32 hash = ECDSA.toEthSignedMessageHash(keccak256(bytes.concat(_userOp.signature[0:6], _userOpHash))); @@ -73,7 +78,7 @@ contract KillSwitchValidator is IKernelValidator { if (validatorStorage.guardian != recovered) { return SIG_VALIDATION_FAILED; } - return _packValidationData(false, 0, pausedUntil); + return packValidationData(pausedUntil, ValidUntil.wrap(0)); } else { return SIG_VALIDATION_FAILED; } diff --git a/src/validator/MultiECDSAValidator.sol b/src/validator/MultiECDSAValidator.sol index 599e2731..fe8726d6 100644 --- a/src/validator/MultiECDSAValidator.sol +++ b/src/validator/MultiECDSAValidator.sol @@ -6,6 +6,7 @@ import "solady/utils/ECDSA.sol"; import "src/utils/KernelHelper.sol"; import "src/interfaces/IAddressBook.sol"; import "src/interfaces/IValidator.sol"; +import "src/common/Types.sol"; contract MultiECDSAValidator is IKernelValidator { event OwnerAdded(address indexed kernel, address indexed owner); @@ -34,11 +35,11 @@ contract MultiECDSAValidator is IKernelValidator { external payable override - returns (uint256 validationData) + returns (ValidationData validationData) { address signer = ECDSA.recover(_userOpHash, _userOp.signature); if (isOwner[signer][msg.sender]) { - return 0; + return ValidationData.wrap(0); } bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); @@ -46,20 +47,20 @@ contract MultiECDSAValidator is IKernelValidator { if (!isOwner[signer][msg.sender]) { return SIG_VALIDATION_FAILED; } - return 0; + return ValidationData.wrap(0); } - function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { + function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (ValidationData) { address signer = ECDSA.recover(hash, signature); if (isOwner[signer][msg.sender]) { - return 0; + return ValidationData.wrap(0); } bytes32 ethHash = ECDSA.toEthSignedMessageHash(hash); signer = ECDSA.recover(ethHash, signature); if (!isOwner[signer][msg.sender]) { return SIG_VALIDATION_FAILED; } - return 0; + return ValidationData.wrap(0); } function validCaller(address _caller, bytes calldata) external view override returns (bool) { diff --git a/src/validator/SessionKeyOwnedValidator.sol b/src/validator/SessionKeyOwnedValidator.sol index db1f80f1..b985dbe6 100644 --- a/src/validator/SessionKeyOwnedValidator.sol +++ b/src/validator/SessionKeyOwnedValidator.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.0; import "solady/utils/ECDSA.sol"; import "solady/utils/EIP712.sol"; -import "account-abstraction/core/Helpers.sol"; import "src/utils/KernelHelper.sol"; import "src/interfaces/IValidator.sol"; +import "src/common/Types.sol"; struct SessionKeyStorage { - uint48 validUntil; - uint48 validAfter; + ValidUntil validUntil; + ValidAfter validAfter; } contract SessionKeyOwnedValidator is IKernelValidator { @@ -25,9 +25,12 @@ contract SessionKeyOwnedValidator is IKernelValidator { function enable(bytes calldata _data) external payable override { address sessionKey = address(bytes20(_data[0:20])); - uint48 validUntil = uint48(bytes6(_data[20:26])); - uint48 validAfter = uint48(bytes6(_data[26:32])); - require(validUntil > validAfter, "SessionKeyOwnedValidator: invalid validUntil/validAfter"); // we do not allow validUntil == 0 here use validUntil == 2**48-1 instead + ValidAfter validAfter = ValidAfter.wrap(uint48(bytes6(_data[20:26]))); + ValidUntil validUntil = ValidUntil.wrap(uint48(bytes6(_data[26:32]))); + require( + ValidUntil.unwrap(validUntil) > ValidAfter.unwrap(validAfter), + "SessionKeyOwnedValidator: invalid validUntil/validAfter" + ); // we do not allow validUntil == 0 here use validUntil == 2**48-1 instead sessionKeyStorage[sessionKey][msg.sender] = SessionKeyStorage(validUntil, validAfter); } @@ -35,37 +38,37 @@ contract SessionKeyOwnedValidator is IKernelValidator { external payable override - returns (uint256 validationData) + returns (ValidationData validationData) { bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); address recovered = ECDSA.recover(hash, _userOp.signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (sessionKey.validUntil == 0) { + if (ValidUntil.unwrap(sessionKey.validUntil) == 0) { // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } - validationData = _packValidationData(false, sessionKey.validUntil, sessionKey.validAfter); + validationData = packValidationData(sessionKey.validAfter, sessionKey.validUntil); } - function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { + function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (ValidationData) { bytes32 ethhash = ECDSA.toEthSignedMessageHash(hash); address recovered = ECDSA.recover(ethhash, signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (sessionKey.validUntil == 0) { + if (ValidUntil.unwrap(sessionKey.validUntil) == 0) { // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } - return _packValidationData(false, sessionKey.validUntil, sessionKey.validAfter); + return packValidationData(sessionKey.validAfter, sessionKey.validUntil); } function validCaller(address _caller, bytes calldata) external view override returns (bool) { SessionKeyStorage storage sessionKey = sessionKeyStorage[_caller][msg.sender]; - if (block.timestamp <= sessionKey.validAfter) { + if (block.timestamp <= ValidAfter.unwrap(sessionKey.validAfter)) { return false; } - if (block.timestamp > sessionKey.validUntil) { + if (block.timestamp > ValidUntil.unwrap(sessionKey.validUntil)) { return false; } return true; diff --git a/src/validator/SessionKeyValidator.sol b/src/validator/SessionKeyValidator.sol index 155d4953..6a94a1bb 100644 --- a/src/validator/SessionKeyValidator.sol +++ b/src/validator/SessionKeyValidator.sol @@ -2,10 +2,11 @@ pragma solidity ^0.8.0; import "solady/utils/ECDSA.sol"; import "src/interfaces/IValidator.sol"; -import "account-abstraction/core/Helpers.sol"; import "solady/utils/MerkleProofLib.sol"; +import "src/common/Constants.sol"; import "src/common/Enum.sol"; import "src/common/Structs.sol"; +import "src/common/Types.sol"; contract ExecuteSessionKeyValidator is IKernelValidator { mapping(address sessionKey => mapping(address kernel => SessionData)) public sessionData; @@ -13,8 +14,8 @@ contract ExecuteSessionKeyValidator is IKernelValidator { function enable(bytes calldata _data) external payable { address sessionKey = address(bytes20(_data[0:20])); bytes32 merkleRoot = bytes32(_data[20:52]); - uint48 validAfter = uint48(bytes6(_data[52:58])); - uint48 validUntil = uint48(bytes6(_data[58:64])); + ValidAfter validAfter = ValidAfter.wrap(uint48(bytes6(_data[52:58]))); + ValidUntil validUntil = ValidUntil.wrap(uint48(bytes6(_data[58:64]))); address paymaster = address(bytes20(_data[64:84])); sessionData[sessionKey][msg.sender] = SessionData(merkleRoot, validAfter, validUntil, paymaster, true); } @@ -28,7 +29,7 @@ contract ExecuteSessionKeyValidator is IKernelValidator { function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256) external payable - returns (uint256) + returns (ValidationData) { // userOp.signature = signer + signature + permission + merkleProof address sessionKey = address(bytes20(userOp.signature[0:20])); @@ -37,7 +38,7 @@ contract ExecuteSessionKeyValidator is IKernelValidator { require(session.enabled, "SessionKeyValidator: session key not enabled"); if (session.merkleRoot == bytes32(0)) { // sessionKey allowed to execute any tx - return _packValidationData(false, session.validUntil, session.validAfter); + return packValidationData(session.validAfter, session.validUntil); } if (session.paymaster == address(1)) { require(userOp.paymasterAndData.length != 0, "SessionKeyValidator: paymaster not set"); @@ -50,7 +51,10 @@ contract ExecuteSessionKeyValidator is IKernelValidator { (Permission memory permission, bytes32[] memory merkleProof) = abi.decode(userOp.signature[85:], (Permission, bytes32[])); - require(permission.target == address(0) || address(bytes20(userOp.callData[16:36])) == permission.target, "SessionKeyValidator: target mismatch"); + require( + permission.target == address(0) || address(bytes20(userOp.callData[16:36])) == permission.target, + "SessionKeyValidator: target mismatch" + ); require( uint256(bytes32(userOp.callData[36:68])) <= permission.valueLimit, "SessionKeyValidator: value limit exceeded" @@ -82,14 +86,17 @@ contract ExecuteSessionKeyValidator is IKernelValidator { } bool result = MerkleProofLib.verify(merkleProof, session.merkleRoot, keccak256(abi.encode(permission))) && (sessionKey == ECDSA.recover(ECDSA.toEthSignedMessageHash(userOpHash), signature)); - return _packValidationData(!result, session.validUntil, session.validAfter); + if (!result) { + return SIG_VALIDATION_FAILED; + } + return packValidationData(session.validAfter, session.validUntil); } function validCaller(address, bytes calldata) external pure returns (bool) { revert("SessionKeyValidator: not implemented"); } - function validateSignature(bytes32, bytes calldata) external pure returns (uint256) { + function validateSignature(bytes32, bytes calldata) external pure returns (ValidationData) { revert("SessionKeyValidator: not implemented"); } } diff --git a/test/foundry/Kernel.t.sol b/test/foundry/Kernel.t.sol index 0b0f200c..a28d04ad 100644 --- a/test/foundry/Kernel.t.sol +++ b/test/foundry/Kernel.t.sol @@ -18,35 +18,25 @@ using ERC4337Utils for EntryPoint; contract KernelTest is KernelTestBase { function setUp() public { - (owner, ownerKey) = makeAddrAndKey("owner"); - (factoryOwner,) = makeAddrAndKey("factoryOwner"); - entryPoint = new EntryPoint(); - kernelImpl = new Kernel(entryPoint); - factory = new KernelFactory(factoryOwner, entryPoint); - vm.startPrank(factoryOwner); - factory.setImplementation(address(kernelImpl), true); - vm.stopPrank(); - - validator = new ECDSAValidator(); + _initialize(); + defaultValidator = new ECDSAValidator(); + _setAddress(); + } - kernel = Kernel( - payable( - address( - factory.createAccount( - address(kernelImpl), - abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), - 0 - ) - ) - ) + function test_should_return_address_if_deployed() external { + address proxy = factory.createAccount( + address(kernelImpl), + abi.encodeWithSelector( + KernelStorage.initialize.selector, defaultValidator, abi.encodePacked(owner) + ), + 0 ); - vm.deal(address(kernel), 1e30); - beneficiary = payable(address(makeAddr("beneficiary"))); + assertEq(proxy, address(kernel)); } function test_initialize_twice() external { vm.expectRevert(); - kernel.initialize(validator, abi.encodePacked(owner)); + kernel.initialize(defaultValidator, abi.encodePacked(owner)); } function test_external_call_default() external { @@ -61,7 +51,9 @@ contract KernelTest is KernelTestBase { address( factory.createAccount( address(kernelImpl), - abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), + abi.encodeWithSelector( + KernelStorage.initialize.selector, defaultValidator, abi.encodePacked(owner) + ), 1 ) ) @@ -74,7 +66,7 @@ contract KernelTest is KernelTestBase { function test_validate_userOp() external { TestKernel kernel2 = new TestKernel(entryPoint); - kernel2.sudoInitialize(validator, abi.encodePacked(owner)); + kernel2.sudoInitialize(defaultValidator, abi.encodePacked(owner)); UserOperation memory op = entryPoint.fillUserOp( address(kernel), abi.encodeWithSelector(Kernel.execute.selector, address(0), 0, bytes("")) @@ -136,8 +128,8 @@ contract KernelTest is KernelTestBase { ExecutionDetail memory execution = KernelStorage(address(kernel)).getExecution(bytes4(0xdeadbeef)); assertEq(execution.executor, address(0xdead)); assertEq(address(execution.validator), address(newValidator)); - assertEq(uint256(execution.validUntil), uint256(0)); - assertEq(uint256(execution.validAfter), uint256(0)); + assertEq(uint256(ValidUntil.unwrap(execution.validUntil)), uint256(0)); + assertEq(uint256(ValidAfter.unwrap(execution.validAfter)), uint256(0)); } function test_external_call_execution() external { @@ -162,8 +154,8 @@ contract KernelTest is KernelTestBase { ExecutionDetail memory execution = KernelStorage(address(kernel)).getExecution(bytes4(0xdeadbeef)); assertEq(execution.executor, address(0xdead)); assertEq(address(execution.validator), address(newValidator)); - assertEq(uint256(execution.validUntil), uint256(0)); - assertEq(uint256(execution.validAfter), uint256(0)); + assertEq(uint256(ValidUntil.unwrap(execution.validUntil)), uint256(0)); + assertEq(uint256(ValidAfter.unwrap(execution.validAfter)), uint256(0)); address randomAddr = makeAddr("random"); newValidator.sudoSetCaller(address(kernel), randomAddr); diff --git a/test/foundry/KernelExecution.t.sol b/test/foundry/KernelExecution.t.sol index 990f2c5d..21c87dea 100644 --- a/test/foundry/KernelExecution.t.sol +++ b/test/foundry/KernelExecution.t.sol @@ -20,30 +20,9 @@ using ERC4337Utils for EntryPoint; contract KernelExecutionTest is KernelTestBase { function setUp() public { - (owner, ownerKey) = makeAddrAndKey("owner"); - (factoryOwner,) = makeAddrAndKey("factoryOwner"); - entryPoint = new EntryPoint(); - kernelImpl = new Kernel(entryPoint); - factory = new KernelFactory(factoryOwner, entryPoint); - vm.startPrank(factoryOwner); - factory.setImplementation(address(kernelImpl), true); - vm.stopPrank(); - - validator = new ECDSAValidator(); - - kernel = Kernel( - payable( - address( - factory.createAccount( - address(kernelImpl), - abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), - 0 - ) - ) - ) - ); - vm.deal(address(kernel), 1e30); - beneficiary = payable(address(makeAddr("beneficiary"))); + _initialize(); + defaultValidator = new ECDSAValidator(); + _setAddress(); } function test_revert_when_mode_disabled() external { diff --git a/test/foundry/KernelHelper.t.sol b/test/foundry/KernelHelper.t.sol index cfa9d12e..dd85fb74 100644 --- a/test/foundry/KernelHelper.t.sol +++ b/test/foundry/KernelHelper.t.sol @@ -2,33 +2,30 @@ pragma solidity ^0.8.0; import "forge-std/Test.sol"; import "src/utils/KernelHelper.sol"; -import "account-abstraction/core/Helpers.sol"; +import {_packValidationData} from "account-abstraction/core/Helpers.sol"; +import "src/common/Types.sol"; contract KernelHelperTest is Test { - function testIntersect(uint48 validAfterA, uint48 validUntilA, uint48 validAfterB, uint48 validUntilB) public { - if (validUntilB == 0) { - validUntilB = 0xffffffffffff; + function testIntersect( + ValidAfter validAfterA, + ValidUntil validUntilA, + ValidAfter validAfterB, + ValidUntil validUntilB + ) public { + if (ValidUntil.unwrap(validUntilB) == 0) { + validUntilB = ValidUntil.wrap(0xffffffffffff); } - if (validUntilA == 0) { - validUntilA = 0xffffffffffff; + if (ValidUntil.unwrap(validUntilA) == 0) { + validUntilA = ValidUntil.wrap(0xffffffffffff); } - uint256 a = _packValidationData(false, validUntilA, validAfterA); - uint256 b = _packValidationData(false, validUntilB, validAfterB); - uint256 c = _intersectValidationData(a, b); + ValidationData a = packValidationData(validAfterA, validUntilA); + ValidationData b = packValidationData(validAfterB, validUntilB); + ValidationData c = _intersectValidationData(a, b); - uint256 expected = _packValidationData( - false, - validUntilA < validUntilB ? validUntilA : validUntilB, - validAfterA > validAfterB ? validAfterA : validAfterB + ValidationData expected = packValidationData( + ValidAfter.unwrap(validAfterA) > ValidAfter.unwrap(validAfterB) ? validAfterA : validAfterB, + ValidUntil.unwrap(validUntilA) < ValidUntil.unwrap(validUntilB) ? validUntilA : validUntilB ); - assertEq(c, expected); - } - - function testIntersectDiff(address a, address b) public { - vm.assume(a != b); - uint256 a_packed = _packValidationData(ValidationData({aggregator: a, validAfter: 0, validUntil: 0})); - uint256 b_packed = _packValidationData(ValidationData({aggregator: b, validAfter: 0, validUntil: 0})); - uint256 c = _intersectValidationData(a_packed, b_packed); - assertEq(c, 1); + assertEq(ValidationData.unwrap(c), ValidationData.unwrap(expected)); } } diff --git a/test/foundry/utils/ERC4337Utils.sol b/test/foundry/utils/ERC4337Utils.sol index 50b6c1af..bd962523 100644 --- a/test/foundry/utils/ERC4337Utils.sol +++ b/test/foundry/utils/ERC4337Utils.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "account-abstraction/core/EntryPoint.sol"; +import {EntryPoint, UserOperation} from "account-abstraction/core/EntryPoint.sol"; import "forge-std/Test.sol"; import "solady/utils/ECDSA.sol"; import "src/Kernel.sol"; @@ -13,12 +13,41 @@ abstract contract KernelTestBase is Test { Kernel kernelImpl; KernelFactory factory; EntryPoint entryPoint; - ECDSAValidator validator; + IKernelValidator defaultValidator; address owner; uint256 ownerKey; address payable beneficiary; address factoryOwner; + function _initialize() internal { + (owner, ownerKey) = makeAddrAndKey("owner"); + (factoryOwner,) = makeAddrAndKey("factoryOwner"); + beneficiary = payable(address(makeAddr("beneficiary"))); + entryPoint = new EntryPoint(); + kernelImpl = new Kernel(entryPoint); + factory = new KernelFactory(factoryOwner, entryPoint); + vm.startPrank(factoryOwner); + factory.setImplementation(address(kernelImpl), true); + vm.stopPrank(); + } + + function _setAddress() internal { + kernel = Kernel( + payable( + address( + factory.createAccount( + address(kernelImpl), + abi.encodeWithSelector( + KernelStorage.initialize.selector, defaultValidator, abi.encodePacked(owner) + ), + 0 + ) + ) + ) + ); + vm.deal(address(kernel), 1e30); + } + function logGas(UserOperation memory op) internal returns (uint256 used) { try this.consoleGasUsage(op) { revert("should revert"); diff --git a/test/foundry/validator/SessionKeyValidator.t.sol b/test/foundry/validator/SessionKeyValidator.t.sol index 4503ff37..06349669 100644 --- a/test/foundry/validator/SessionKeyValidator.t.sol +++ b/test/foundry/validator/SessionKeyValidator.t.sol @@ -25,35 +25,14 @@ contract SessionKeyValidatorTest is KernelTestBase { uint256 sessionKeyPriv; function setUp() public { - (owner, ownerKey) = makeAddrAndKey("owner"); - (factoryOwner,) = makeAddrAndKey("factoryOwner"); + _initialize(); + defaultValidator = new ECDSAValidator(); + _setAddress(); (sessionKey, sessionKeyPriv) = makeAddrAndKey("sessionKey"); - entryPoint = new EntryPoint(); - kernelImpl = new Kernel(entryPoint); - factory = new KernelFactory(factoryOwner, entryPoint); - vm.startPrank(factoryOwner); - factory.setImplementation(address(kernelImpl), true); - vm.stopPrank(); - - validator = new ECDSAValidator(); - - kernel = Kernel( - payable( - address( - factory.createAccount( - address(kernelImpl), - abi.encodeWithSelector(KernelStorage.initialize.selector, validator, abi.encodePacked(owner)), - 0 - ) - ) - ) - ); - vm.deal(address(kernel), 1e30); - beneficiary = payable(address(makeAddr("beneficiary"))); testToken = new TestERC20(); sessionKeyValidator = new ExecuteSessionKeyValidator(); } - + function test_mode_2_no_paymaster() external { testToken.mint(address(kernel), 100e18); TestERC20 testToken2 = new TestERC20(); @@ -69,11 +48,7 @@ contract SessionKeyValidatorTest is KernelTestBase { ); ParamRule[] memory rules = new ParamRule[](1); - rules[0] = ParamRule({ - offset: 32, - condition: ParamCondition.LESS_THAN_OR_EQUAL, - param: bytes32(uint256(1e18)) - }); + rules[0] = ParamRule({offset: 32, condition: ParamCondition.LESS_THAN_OR_EQUAL, param: bytes32(uint256(1e18))}); bytes32[] memory data = new bytes32[](2); data[0] = keccak256( @@ -159,11 +134,7 @@ contract SessionKeyValidatorTest is KernelTestBase { ); ParamRule[] memory rules = new ParamRule[](1); - rules[0] = ParamRule({ - offset: 32, - condition: ParamCondition.LESS_THAN_OR_EQUAL, - param: bytes32(uint256(1e18)) - }); + rules[0] = ParamRule({offset: 32, condition: ParamCondition.LESS_THAN_OR_EQUAL, param: bytes32(uint256(1e18))}); bytes32[] memory data = new bytes32[](2); data[0] = keccak256( @@ -249,11 +220,7 @@ contract SessionKeyValidatorTest is KernelTestBase { ); ParamRule[] memory rules = new ParamRule[](1); - rules[0] = ParamRule({ - offset: 32, - condition: ParamCondition.LESS_THAN_OR_EQUAL, - param: bytes32(uint256(1e18)) - }); + rules[0] = ParamRule({offset: 32, condition: ParamCondition.LESS_THAN_OR_EQUAL, param: bytes32(uint256(1e18))}); bytes32[] memory data = new bytes32[](2); data[0] = keccak256( @@ -321,7 +288,7 @@ contract SessionKeyValidatorTest is KernelTestBase { ops[0] = op; logGas(op); - vm.expectRevert(); + vm.expectRevert(); entryPoint.handleOps(ops, beneficiary); } } From b76f241cd3042c42665754c37c928772e7c8d062 Mon Sep 17 00:00:00 2001 From: taek Date: Wed, 16 Aug 2023 23:50:16 +0900 Subject: [PATCH 14/33] Deploy/v2.1 (#28) * deploy kernel/sessionkey on mumbai * fix:check proxy deployment first and try deploy * deployed new factory * deployed on mumbai, goerli * deployed to testnets * seprate stake * deployed to polygon * deployed and staked on mainnets --- .../1/run-1692154943.json | 34 +++ .../1/run-1692154962.json | 49 +++ .../1/run-latest.json | 49 +++ .../10/run-1692128913.json | 34 +++ .../10/run-1692128920.json | 49 +++ .../10/run-latest.json | 49 +++ .../100/run-1692129469.json | 34 +++ .../100/run-1692129489.json | 49 +++ .../100/run-latest.json | 49 +++ .../137/run-1692126959.json | 33 ++ .../137/run-1692126966.json | 65 ++++ .../137/run-latest.json | 65 ++++ .../420/run-1692073702.json | 34 +++ .../420/run-1692073709.json | 49 +++ .../420/run-latest.json | 49 +++ .../42161/run-1692128749.json | 48 +++ .../42161/run-latest.json | 48 +++ .../421613/run-1692072434.json | 49 +++ .../421613/run-latest.json | 49 +++ .../43113/run-1692072788.json | 34 +++ .../43113/run-1692072795.json | 49 +++ .../43113/run-latest.json | 49 +++ .../43114/run-1692129083.json | 34 +++ .../43114/run-1692129090.json | 49 +++ .../43114/run-latest.json | 49 +++ .../5/run-1692071959.json | 33 ++ .../5/run-1692071966.json | 48 +++ .../5/run-latest.json | 48 +++ .../8453/run-1692129357.json | 34 +++ .../8453/run-1692129364.json | 49 +++ .../8453/run-latest.json | 49 +++ .../84531/run-1692074144.json | 34 +++ .../84531/run-1692074152.json | 49 +++ .../84531/run-latest.json | 49 +++ .../DeployKernel.s.sol/1/run-1692129664.json | 75 +++++ .../DeployKernel.s.sol/1/run-1692154809.json | 78 +++++ .../DeployKernel.s.sol/1/run-latest.json | 78 +++++ .../DeployKernel.s.sol/10/run-1692128880.json | 79 +++++ .../DeployKernel.s.sol/10/run-1692128887.json | 140 +++++++++ .../DeployKernel.s.sol/10/run-latest.json | 174 +++++------ .../100/run-1692129436.json | 79 +++++ .../100/run-1692129443.json | 140 +++++++++ .../DeployKernel.s.sol/100/run-latest.json | 140 +++++++++ .../10200/run-1692074427.json | 102 +++++++ .../10200/run-1692074434.json | 193 ++++++++++++ .../DeployKernel.s.sol/10200/run-latest.json | 104 +++---- .../137/run-1692126883.json | 76 +++++ .../137/run-1692126890.json | 187 ++++++++++++ .../DeployKernel.s.sol/137/run-latest.json | 202 ++++++------ .../420/run-1692073665.json | 102 +++++++ .../420/run-1692073672.json | 193 ++++++++++++ .../DeployKernel.s.sol/420/run-latest.json | 112 +++---- .../42161/run-1692128723.json | 137 +++++++++ .../DeployKernel.s.sol/42161/run-latest.json | 153 +++++----- .../421613/run-1692072403.json | 193 ++++++++++++ .../DeployKernel.s.sol/421613/run-latest.json | 108 +++---- .../43113/run-1692072581.json | 102 +++++++ .../43113/run-1692072594.json | 193 ++++++++++++ .../DeployKernel.s.sol/43113/run-latest.json | 147 +++++++-- .../43114/run-1692129024.json | 79 +++++ .../43114/run-1692129038.json | 140 +++++++++ .../DeployKernel.s.sol/43114/run-latest.json | 140 +++++++++ .../DeployKernel.s.sol/5/run-1692071131.json | 98 ++++++ .../DeployKernel.s.sol/5/run-1692071144.json | 189 ++++++++++++ .../DeployKernel.s.sol/5/run-latest.json | 128 ++++---- .../80001/run-1692029918.json | 98 ++++++ .../80001/run-1692029925.json | 287 ++++++++++++++++++ .../80001/run-1692067755.json | 78 +++++ .../80001/run-1692067761.json | 235 ++++++++++++++ .../80001/run-1692067762.json | 235 ++++++++++++++ .../DeployKernel.s.sol/80001/run-latest.json | 218 +++++++++++-- .../8453/run-1692129323.json | 79 +++++ .../8453/run-1692129331.json | 140 +++++++++ .../DeployKernel.s.sol/8453/run-latest.json | 140 +++++++++ .../84531/run-1692073995.json | 97 ++++++ .../84531/run-1692074111.json | 102 +++++++ .../84531/run-1692074119.json | 193 ++++++++++++ .../DeployKernel.s.sol/84531/run-latest.json | 104 +++---- .../1/run-1692154988.json | 34 +++ .../1/run-1692154995.json | 49 +++ .../DeploySessionKey.s.sol/1/run-latest.json | 49 +++ .../10/run-1692128944.json | 34 +++ .../10/run-1692128951.json | 49 +++ .../DeploySessionKey.s.sol/10/run-latest.json | 49 +++ .../100/run-1692129514.json | 34 +++ .../100/run-1692129521.json | 49 +++ .../100/run-latest.json | 49 +++ .../10200/run-1692074391.json | 34 +++ .../10200/run-1692074398.json | 49 +++ .../10200/run-latest.json | 26 +- .../137/run-1692128336.json | 33 ++ .../137/run-1692128368.json | 65 ++++ .../137/run-latest.json | 65 ++++ .../420/run-1692073753.json | 34 +++ .../420/run-1692073760.json | 49 +++ .../420/run-latest.json | 26 +- .../42161/run-1692128782.json | 48 +++ .../42161/run-latest.json | 48 +++ .../421613/run-1692072464.json | 49 +++ .../421613/run-latest.json | 26 +- .../43113/run-1692073040.json | 34 +++ .../43113/run-1692073046.json | 49 +++ .../43113/run-latest.json | 24 +- .../43114/run-1692129118.json | 34 +++ .../43114/run-1692129131.json | 49 +++ .../43114/run-latest.json | 49 +++ .../5/run-1692071407.json | 33 ++ .../5/run-1692071413.json | 48 +++ .../DeploySessionKey.s.sol/5/run-latest.json | 28 +- .../80001/run-1692030086.json | 33 ++ .../80001/run-1692030093.json | 65 ++++ .../80001/run-latest.json | 42 +-- .../8453/run-1692129384.json | 34 +++ .../8453/run-1692129391.json | 49 +++ .../8453/run-latest.json | 49 +++ .../84531/run-1692074181.json | 34 +++ .../84531/run-1692074188.json | 49 +++ .../84531/run-latest.json | 24 +- .../1/run-1692156425.json | 33 ++ .../1/run-1692156438.json | 63 ++++ .../StakeToFactory.s.sol/1/run-latest.json | 63 ++++ .../10/run-1692157058.json | 33 ++ .../10/run-1692157065.json | 63 ++++ .../StakeToFactory.s.sol/10/run-latest.json | 63 ++++ .../100/run-1692157427.json | 34 +++ .../100/run-1692157434.json | 64 ++++ .../StakeToFactory.s.sol/100/run-latest.json | 64 ++++ .../137/run-1692154620.json | 33 ++ .../137/run-1692154627.json | 111 +++++++ .../StakeToFactory.s.sol/137/run-latest.json | 111 +++++++ .../42161/run-1692157109.json | 63 ++++ .../42161/run-latest.json | 63 ++++ .../43114/run-1692157199.json | 33 ++ .../43114/run-1692157206.json | 63 ++++ .../43114/run-latest.json | 63 ++++ .../80001/run-1692128251.json | 33 ++ .../80001/run-1692128258.json | 111 +++++++ .../80001/run-latest.json | 111 +++++++ .../8453/run-1692157271.json | 34 +++ .../8453/run-1692157277.json | 64 ++++ .../StakeToFactory.s.sol/8453/run-latest.json | 64 ++++ gas/ecdsa/report.txt | 34 +-- scripts/DeployECDSAValidator.s.sol | 23 ++ scripts/DeployKernel.s.sol | 20 +- scripts/DeploySessionKey.s.sol | 4 +- scripts/StakeToFactory.s.sol | 23 ++ src/factory/AdminLessERC1967Factory.sol | 89 ++---- test/foundry/Kernel.t.sol | 5 +- 148 files changed, 10123 insertions(+), 796 deletions(-) create mode 100644 broadcast/DeployECDSAValidator.s.sol/1/run-1692154943.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/1/run-1692154962.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/1/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/10/run-1692128913.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/10/run-1692128920.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/10/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/100/run-1692129469.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/100/run-1692129489.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/100/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/137/run-1692126959.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/137/run-1692126966.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/137/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/420/run-1692073702.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/420/run-1692073709.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/420/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/42161/run-1692128749.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/42161/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/421613/run-1692072434.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/421613/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/43113/run-1692072788.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/43113/run-1692072795.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/43113/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/43114/run-1692129083.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/43114/run-1692129090.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/43114/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/5/run-1692071959.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/5/run-1692071966.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/5/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/8453/run-1692129357.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/8453/run-1692129364.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/8453/run-latest.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/84531/run-1692074144.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/84531/run-1692074152.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/84531/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/1/run-1692129664.json create mode 100644 broadcast/DeployKernel.s.sol/1/run-1692154809.json create mode 100644 broadcast/DeployKernel.s.sol/1/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/10/run-1692128880.json create mode 100644 broadcast/DeployKernel.s.sol/10/run-1692128887.json create mode 100644 broadcast/DeployKernel.s.sol/100/run-1692129436.json create mode 100644 broadcast/DeployKernel.s.sol/100/run-1692129443.json create mode 100644 broadcast/DeployKernel.s.sol/100/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/10200/run-1692074427.json create mode 100644 broadcast/DeployKernel.s.sol/10200/run-1692074434.json create mode 100644 broadcast/DeployKernel.s.sol/137/run-1692126883.json create mode 100644 broadcast/DeployKernel.s.sol/137/run-1692126890.json create mode 100644 broadcast/DeployKernel.s.sol/420/run-1692073665.json create mode 100644 broadcast/DeployKernel.s.sol/420/run-1692073672.json create mode 100644 broadcast/DeployKernel.s.sol/42161/run-1692128723.json create mode 100644 broadcast/DeployKernel.s.sol/421613/run-1692072403.json create mode 100644 broadcast/DeployKernel.s.sol/43113/run-1692072581.json create mode 100644 broadcast/DeployKernel.s.sol/43113/run-1692072594.json create mode 100644 broadcast/DeployKernel.s.sol/43114/run-1692129024.json create mode 100644 broadcast/DeployKernel.s.sol/43114/run-1692129038.json create mode 100644 broadcast/DeployKernel.s.sol/43114/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/5/run-1692071131.json create mode 100644 broadcast/DeployKernel.s.sol/5/run-1692071144.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1692029918.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1692029925.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1692067755.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1692067761.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1692067762.json create mode 100644 broadcast/DeployKernel.s.sol/8453/run-1692129323.json create mode 100644 broadcast/DeployKernel.s.sol/8453/run-1692129331.json create mode 100644 broadcast/DeployKernel.s.sol/8453/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/84531/run-1692073995.json create mode 100644 broadcast/DeployKernel.s.sol/84531/run-1692074111.json create mode 100644 broadcast/DeployKernel.s.sol/84531/run-1692074119.json create mode 100644 broadcast/DeploySessionKey.s.sol/1/run-1692154988.json create mode 100644 broadcast/DeploySessionKey.s.sol/1/run-1692154995.json create mode 100644 broadcast/DeploySessionKey.s.sol/1/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/10/run-1692128944.json create mode 100644 broadcast/DeploySessionKey.s.sol/10/run-1692128951.json create mode 100644 broadcast/DeploySessionKey.s.sol/10/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/100/run-1692129514.json create mode 100644 broadcast/DeploySessionKey.s.sol/100/run-1692129521.json create mode 100644 broadcast/DeploySessionKey.s.sol/100/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/10200/run-1692074391.json create mode 100644 broadcast/DeploySessionKey.s.sol/10200/run-1692074398.json create mode 100644 broadcast/DeploySessionKey.s.sol/137/run-1692128336.json create mode 100644 broadcast/DeploySessionKey.s.sol/137/run-1692128368.json create mode 100644 broadcast/DeploySessionKey.s.sol/137/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/420/run-1692073753.json create mode 100644 broadcast/DeploySessionKey.s.sol/420/run-1692073760.json create mode 100644 broadcast/DeploySessionKey.s.sol/42161/run-1692128782.json create mode 100644 broadcast/DeploySessionKey.s.sol/42161/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/421613/run-1692072464.json create mode 100644 broadcast/DeploySessionKey.s.sol/43113/run-1692073040.json create mode 100644 broadcast/DeploySessionKey.s.sol/43113/run-1692073046.json create mode 100644 broadcast/DeploySessionKey.s.sol/43114/run-1692129118.json create mode 100644 broadcast/DeploySessionKey.s.sol/43114/run-1692129131.json create mode 100644 broadcast/DeploySessionKey.s.sol/43114/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/5/run-1692071407.json create mode 100644 broadcast/DeploySessionKey.s.sol/5/run-1692071413.json create mode 100644 broadcast/DeploySessionKey.s.sol/80001/run-1692030086.json create mode 100644 broadcast/DeploySessionKey.s.sol/80001/run-1692030093.json create mode 100644 broadcast/DeploySessionKey.s.sol/8453/run-1692129384.json create mode 100644 broadcast/DeploySessionKey.s.sol/8453/run-1692129391.json create mode 100644 broadcast/DeploySessionKey.s.sol/8453/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/84531/run-1692074181.json create mode 100644 broadcast/DeploySessionKey.s.sol/84531/run-1692074188.json create mode 100644 broadcast/StakeToFactory.s.sol/1/run-1692156425.json create mode 100644 broadcast/StakeToFactory.s.sol/1/run-1692156438.json create mode 100644 broadcast/StakeToFactory.s.sol/1/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/10/run-1692157058.json create mode 100644 broadcast/StakeToFactory.s.sol/10/run-1692157065.json create mode 100644 broadcast/StakeToFactory.s.sol/10/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/100/run-1692157427.json create mode 100644 broadcast/StakeToFactory.s.sol/100/run-1692157434.json create mode 100644 broadcast/StakeToFactory.s.sol/100/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/137/run-1692154620.json create mode 100644 broadcast/StakeToFactory.s.sol/137/run-1692154627.json create mode 100644 broadcast/StakeToFactory.s.sol/137/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/42161/run-1692157109.json create mode 100644 broadcast/StakeToFactory.s.sol/42161/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/43114/run-1692157199.json create mode 100644 broadcast/StakeToFactory.s.sol/43114/run-1692157206.json create mode 100644 broadcast/StakeToFactory.s.sol/43114/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/80001/run-1692128251.json create mode 100644 broadcast/StakeToFactory.s.sol/80001/run-1692128258.json create mode 100644 broadcast/StakeToFactory.s.sol/80001/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/8453/run-1692157271.json create mode 100644 broadcast/StakeToFactory.s.sol/8453/run-1692157277.json create mode 100644 broadcast/StakeToFactory.s.sol/8453/run-latest.json create mode 100644 scripts/DeployECDSAValidator.s.sol create mode 100644 scripts/StakeToFactory.s.sol diff --git a/broadcast/DeployECDSAValidator.s.sol/1/run-1692154943.json b/broadcast/DeployECDSAValidator.s.sol/1/run-1692154943.json new file mode 100644 index 00000000..a900de67 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/1/run-1692154943.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x1e807ae181a24f2c44339f04aa56222c11fbc0d53b5458ae9e65a45382f309a4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xf", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x1e807ae181a24f2c44339f04aa56222c11fbc0d53b5458ae9e65a45382f309a4" + ], + "returns": {}, + "timestamp": 1692154943, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/1/run-1692154962.json b/broadcast/DeployECDSAValidator.s.sol/1/run-1692154962.json new file mode 100644 index 00000000..8ca76926 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/1/run-1692154962.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x1e807ae181a24f2c44339f04aa56222c11fbc0d53b5458ae9e65a45382f309a4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xf", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x1e807ae181a24f2c44339f04aa56222c11fbc0d53b5458ae9e65a45382f309a4", + "transactionIndex": "0xc", + "blockHash": "0xbb24851954e2f94de22291ff3d28f8f60c534a5816bbd905ba9ba5c280f4c0f9", + "blockNumber": "0x11181e7", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x263b57", + "gasUsed": "0x4fcb6", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x6b12eeec4" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692154962, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/1/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/1/run-latest.json new file mode 100644 index 00000000..8ca76926 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/1/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x1e807ae181a24f2c44339f04aa56222c11fbc0d53b5458ae9e65a45382f309a4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xf", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x1e807ae181a24f2c44339f04aa56222c11fbc0d53b5458ae9e65a45382f309a4", + "transactionIndex": "0xc", + "blockHash": "0xbb24851954e2f94de22291ff3d28f8f60c534a5816bbd905ba9ba5c280f4c0f9", + "blockNumber": "0x11181e7", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x263b57", + "gasUsed": "0x4fcb6", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x6b12eeec4" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692154962, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/10/run-1692128913.json b/broadcast/DeployECDSAValidator.s.sol/10/run-1692128913.json new file mode 100644 index 00000000..17f2037f --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/10/run-1692128913.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xba526e1950db6c4e43c5ecea204773f340ffb69f04f46c12e5cfc5ba86a176d7", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xba526e1950db6c4e43c5ecea204773f340ffb69f04f46c12e5cfc5ba86a176d7" + ], + "returns": {}, + "timestamp": 1692128913, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/10/run-1692128920.json b/broadcast/DeployECDSAValidator.s.sol/10/run-1692128920.json new file mode 100644 index 00000000..548e7487 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/10/run-1692128920.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xba526e1950db6c4e43c5ecea204773f340ffb69f04f46c12e5cfc5ba86a176d7", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xba526e1950db6c4e43c5ecea204773f340ffb69f04f46c12e5cfc5ba86a176d7", + "transactionIndex": "0x1", + "blockHash": "0x310c289baa22d6c3e4ed91a73e4697ddbfe3409ffa8996089c7524fc84fbe100", + "blockNumber": "0x673fe6d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5b3a5", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb8d8d7c2" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128920, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/10/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/10/run-latest.json new file mode 100644 index 00000000..548e7487 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/10/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xba526e1950db6c4e43c5ecea204773f340ffb69f04f46c12e5cfc5ba86a176d7", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xba526e1950db6c4e43c5ecea204773f340ffb69f04f46c12e5cfc5ba86a176d7", + "transactionIndex": "0x1", + "blockHash": "0x310c289baa22d6c3e4ed91a73e4697ddbfe3409ffa8996089c7524fc84fbe100", + "blockNumber": "0x673fe6d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5b3a5", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb8d8d7c2" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128920, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/100/run-1692129469.json b/broadcast/DeployECDSAValidator.s.sol/100/run-1692129469.json new file mode 100644 index 00000000..ca111711 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/100/run-1692129469.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xe4b455c0d4786c2ad8ca43cf84b3a2c3405e960df063ca74f34583738a8d9805", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xe4b455c0d4786c2ad8ca43cf84b3a2c3405e960df063ca74f34583738a8d9805" + ], + "returns": {}, + "timestamp": 1692129469, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/100/run-1692129489.json b/broadcast/DeployECDSAValidator.s.sol/100/run-1692129489.json new file mode 100644 index 00000000..04ede4d7 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/100/run-1692129489.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xe4b455c0d4786c2ad8ca43cf84b3a2c3405e960df063ca74f34583738a8d9805", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe4b455c0d4786c2ad8ca43cf84b3a2c3405e960df063ca74f34583738a8d9805", + "transactionIndex": "0x0", + "blockHash": "0x5266bec9cdd7137e2f13e703d7cdd91a7b3b1aa474dace7de395ef039acb6d3e", + "blockNumber": "0x1c1cb95", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fcb6", + "gasUsed": "0x4fcb6", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129489, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/100/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/100/run-latest.json new file mode 100644 index 00000000..04ede4d7 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/100/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xe4b455c0d4786c2ad8ca43cf84b3a2c3405e960df063ca74f34583738a8d9805", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe4b455c0d4786c2ad8ca43cf84b3a2c3405e960df063ca74f34583738a8d9805", + "transactionIndex": "0x0", + "blockHash": "0x5266bec9cdd7137e2f13e703d7cdd91a7b3b1aa474dace7de395ef039acb6d3e", + "blockNumber": "0x1c1cb95", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fcb6", + "gasUsed": "0x4fcb6", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129489, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/137/run-1692126959.json b/broadcast/DeployECDSAValidator.s.sol/137/run-1692126959.json new file mode 100644 index 00000000..4919ef08 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/137/run-1692126959.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x1f" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb" + ], + "returns": {}, + "timestamp": 1692126959, + "chain": 137, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/137/run-1692126966.json b/broadcast/DeployECDSAValidator.s.sol/137/run-1692126966.json new file mode 100644 index 00000000..6ea0a441 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/137/run-1692126966.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x1f" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb", + "transactionIndex": "0x3b", + "blockHash": "0xd694d4bbc61dbd1c2c5b0c58db27576b7f47a3df1f727a089b14b0d26b89e4cb", + "blockNumber": "0x2c333d7", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xbc4fb4", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x0000000000000000000000000000000000000000000000000036f5dc554005cc0000000000000000000000000000000000000000000000172955ddf65a59eeb300000000000000000000000000000000000000000000073863b3e3f13c7b0faa000000000000000000000000000000000000000000000017291ee81a0519e8e700000000000000000000000000000000000000000000073863ead9cd91bb1576", + "blockHash": "0xd694d4bbc61dbd1c2c5b0c58db27576b7f47a3df1f727a089b14b0d26b89e4cb", + "blockNumber": "0x2c333d7", + "transactionHash": "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb", + "transactionIndex": "0x3b", + "logIndex": "0x193", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x5a7ba38f18" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692126966, + "chain": 137, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/137/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/137/run-latest.json new file mode 100644 index 00000000..6ea0a441 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/137/run-latest.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x1f" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb", + "transactionIndex": "0x3b", + "blockHash": "0xd694d4bbc61dbd1c2c5b0c58db27576b7f47a3df1f727a089b14b0d26b89e4cb", + "blockNumber": "0x2c333d7", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xbc4fb4", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + ], + "data": "0x0000000000000000000000000000000000000000000000000036f5dc554005cc0000000000000000000000000000000000000000000000172955ddf65a59eeb300000000000000000000000000000000000000000000073863b3e3f13c7b0faa000000000000000000000000000000000000000000000017291ee81a0519e8e700000000000000000000000000000000000000000000073863ead9cd91bb1576", + "blockHash": "0xd694d4bbc61dbd1c2c5b0c58db27576b7f47a3df1f727a089b14b0d26b89e4cb", + "blockNumber": "0x2c333d7", + "transactionHash": "0xc77bb1834d57250f75893ac6e9211649c14d3599e1ff57a722121c961ba9fafb", + "transactionIndex": "0x3b", + "logIndex": "0x193", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x5a7ba38f18" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692126966, + "chain": 137, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/420/run-1692073702.json b/broadcast/DeployECDSAValidator.s.sol/420/run-1692073702.json new file mode 100644 index 00000000..f9b9cae3 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/420/run-1692073702.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x6214f72edf6e53d34ba87df32336b7a873f714dbf6e9c49c4e3551640691b4fd", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x6214f72edf6e53d34ba87df32336b7a873f714dbf6e9c49c4e3551640691b4fd" + ], + "returns": {}, + "timestamp": 1692073702, + "chain": 420, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/420/run-1692073709.json b/broadcast/DeployECDSAValidator.s.sol/420/run-1692073709.json new file mode 100644 index 00000000..fa3e10d7 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/420/run-1692073709.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x6214f72edf6e53d34ba87df32336b7a873f714dbf6e9c49c4e3551640691b4fd", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x6214f72edf6e53d34ba87df32336b7a873f714dbf6e9c49c4e3551640691b4fd", + "transactionIndex": "0x1", + "blockHash": "0x41776253f999789bf7caac1aa96d096ec98842c6c212f6b656bd56370fb1ee8d", + "blockNumber": "0xcb4a42", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5b375", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692073709, + "chain": 420, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/420/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/420/run-latest.json new file mode 100644 index 00000000..fa3e10d7 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/420/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x6214f72edf6e53d34ba87df32336b7a873f714dbf6e9c49c4e3551640691b4fd", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x6214f72edf6e53d34ba87df32336b7a873f714dbf6e9c49c4e3551640691b4fd", + "transactionIndex": "0x1", + "blockHash": "0x41776253f999789bf7caac1aa96d096ec98842c6c212f6b656bd56370fb1ee8d", + "blockNumber": "0xcb4a42", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5b375", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692073709, + "chain": 420, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/42161/run-1692128749.json b/broadcast/DeployECDSAValidator.s.sol/42161/run-1692128749.json new file mode 100644 index 00000000..91aaa817 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/42161/run-1692128749.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0x094132364f757d6a4916fd8acb93ad6fbd5a54ec6af3f86282108ef839b9a14e", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf5fb26", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xd" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x094132364f757d6a4916fd8acb93ad6fbd5a54ec6af3f86282108ef839b9a14e", + "transactionIndex": "0x1", + "blockHash": "0x653d678a8fe1e3e74f65099eab95280ba7f2cdbdd3a85e99446cc487f2f4ca95", + "blockNumber": "0x74170aa", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa67f4b", + "gasUsed": "0xa67f4b", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128749, + "chain": 42161, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/42161/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/42161/run-latest.json new file mode 100644 index 00000000..91aaa817 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/42161/run-latest.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0x094132364f757d6a4916fd8acb93ad6fbd5a54ec6af3f86282108ef839b9a14e", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf5fb26", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xd" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x094132364f757d6a4916fd8acb93ad6fbd5a54ec6af3f86282108ef839b9a14e", + "transactionIndex": "0x1", + "blockHash": "0x653d678a8fe1e3e74f65099eab95280ba7f2cdbdd3a85e99446cc487f2f4ca95", + "blockNumber": "0x74170aa", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa67f4b", + "gasUsed": "0xa67f4b", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128749, + "chain": 42161, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/421613/run-1692072434.json b/broadcast/DeployECDSAValidator.s.sol/421613/run-1692072434.json new file mode 100644 index 00000000..afbec142 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/421613/run-1692072434.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xfb80378dfa8e4845fe16a9f454d97062c86c91b6ee209306b361cd6d4cfc0c3a", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68f73", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xfb80378dfa8e4845fe16a9f454d97062c86c91b6ee209306b361cd6d4cfc0c3a", + "transactionIndex": "0x1", + "blockHash": "0xc681a77973ebdd1490e289a0746e77a0bf2f78fdfe540820164feb697fe847a0", + "blockNumber": "0x20d64fc", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fc64", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692072434, + "chain": 421613, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/421613/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/421613/run-latest.json new file mode 100644 index 00000000..afbec142 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/421613/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xfb80378dfa8e4845fe16a9f454d97062c86c91b6ee209306b361cd6d4cfc0c3a", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68f73", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xfb80378dfa8e4845fe16a9f454d97062c86c91b6ee209306b361cd6d4cfc0c3a", + "transactionIndex": "0x1", + "blockHash": "0xc681a77973ebdd1490e289a0746e77a0bf2f78fdfe540820164feb697fe847a0", + "blockNumber": "0x20d64fc", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fc64", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692072434, + "chain": 421613, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/43113/run-1692072788.json b/broadcast/DeployECDSAValidator.s.sol/43113/run-1692072788.json new file mode 100644 index 00000000..1a41cf49 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/43113/run-1692072788.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xdef448581f7dfbe4a4a29100cbbf0155f5524e5f792495407458c34a47ffa4f4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xdef448581f7dfbe4a4a29100cbbf0155f5524e5f792495407458c34a47ffa4f4" + ], + "returns": {}, + "timestamp": 1692072788, + "chain": 43113, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/43113/run-1692072795.json b/broadcast/DeployECDSAValidator.s.sol/43113/run-1692072795.json new file mode 100644 index 00000000..73c150dc --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/43113/run-1692072795.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xdef448581f7dfbe4a4a29100cbbf0155f5524e5f792495407458c34a47ffa4f4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xdef448581f7dfbe4a4a29100cbbf0155f5524e5f792495407458c34a47ffa4f4", + "transactionIndex": "0x0", + "blockHash": "0x4e6bbb1f2b1c754e30d41d791a10fcc17461969537c7980a725b4d29d1dd6b2b", + "blockNumber": "0x17d9e71", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fc64", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692072795, + "chain": 43113, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/43113/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/43113/run-latest.json new file mode 100644 index 00000000..73c150dc --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/43113/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xdef448581f7dfbe4a4a29100cbbf0155f5524e5f792495407458c34a47ffa4f4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xdef448581f7dfbe4a4a29100cbbf0155f5524e5f792495407458c34a47ffa4f4", + "transactionIndex": "0x0", + "blockHash": "0x4e6bbb1f2b1c754e30d41d791a10fcc17461969537c7980a725b4d29d1dd6b2b", + "blockNumber": "0x17d9e71", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x4fc64", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692072795, + "chain": 43113, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/43114/run-1692129083.json b/broadcast/DeployECDSAValidator.s.sol/43114/run-1692129083.json new file mode 100644 index 00000000..691e6fe1 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/43114/run-1692129083.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xce12ea207e9ac35c100bd130e8f6ddc27ab2e0f606d921809b8dbab79a79ec1f", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xce12ea207e9ac35c100bd130e8f6ddc27ab2e0f606d921809b8dbab79a79ec1f" + ], + "returns": {}, + "timestamp": 1692129083, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/43114/run-1692129090.json b/broadcast/DeployECDSAValidator.s.sol/43114/run-1692129090.json new file mode 100644 index 00000000..bd565754 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/43114/run-1692129090.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xce12ea207e9ac35c100bd130e8f6ddc27ab2e0f606d921809b8dbab79a79ec1f", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xce12ea207e9ac35c100bd130e8f6ddc27ab2e0f606d921809b8dbab79a79ec1f", + "transactionIndex": "0x2", + "blockHash": "0x9374509e7473afc90c301f5a0255665b7e2bee89d50d1f25e081b99801c574bc", + "blockNumber": "0x2064258", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5fa72", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129090, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/43114/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/43114/run-latest.json new file mode 100644 index 00000000..bd565754 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/43114/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xce12ea207e9ac35c100bd130e8f6ddc27ab2e0f606d921809b8dbab79a79ec1f", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xce12ea207e9ac35c100bd130e8f6ddc27ab2e0f606d921809b8dbab79a79ec1f", + "transactionIndex": "0x2", + "blockHash": "0x9374509e7473afc90c301f5a0255665b7e2bee89d50d1f25e081b99801c574bc", + "blockNumber": "0x2064258", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5fa72", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129090, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/5/run-1692071959.json b/broadcast/DeployECDSAValidator.s.sol/5/run-1692071959.json new file mode 100644 index 00000000..9828850f --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/5/run-1692071959.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xd1657459c55647995c88934fd41bb81b8c1ea215a7137405046329434dd8aad4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x4c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xd1657459c55647995c88934fd41bb81b8c1ea215a7137405046329434dd8aad4" + ], + "returns": {}, + "timestamp": 1692071959, + "chain": 5, + "multi": false, + "commit": "e74c511" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/5/run-1692071966.json b/broadcast/DeployECDSAValidator.s.sol/5/run-1692071966.json new file mode 100644 index 00000000..2059cba5 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/5/run-1692071966.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xd1657459c55647995c88934fd41bb81b8c1ea215a7137405046329434dd8aad4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x4c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xd1657459c55647995c88934fd41bb81b8c1ea215a7137405046329434dd8aad4", + "transactionIndex": "0x2b", + "blockHash": "0x6958fec33f92bf90f69236161d37881a06e133e36777d09855157cc281f867f5", + "blockNumber": "0x9143d1", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf17500", + "gasUsed": "0x4fcb6", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e10a" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692071966, + "chain": 5, + "multi": false, + "commit": "e74c511" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/5/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/5/run-latest.json new file mode 100644 index 00000000..2059cba5 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/5/run-latest.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xd1657459c55647995c88934fd41bb81b8c1ea215a7137405046329434dd8aad4", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x4c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xd1657459c55647995c88934fd41bb81b8c1ea215a7137405046329434dd8aad4", + "transactionIndex": "0x2b", + "blockHash": "0x6958fec33f92bf90f69236161d37881a06e133e36777d09855157cc281f867f5", + "blockNumber": "0x9143d1", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf17500", + "gasUsed": "0x4fcb6", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e10a" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692071966, + "chain": 5, + "multi": false, + "commit": "e74c511" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/8453/run-1692129357.json b/broadcast/DeployECDSAValidator.s.sol/8453/run-1692129357.json new file mode 100644 index 00000000..c9c35d31 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/8453/run-1692129357.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x67ac8a2141514ec3391bb8c6828fcc8067ab1da4654fc3be63e29a3c5e61cfaf", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x67ac8a2141514ec3391bb8c6828fcc8067ab1da4654fc3be63e29a3c5e61cfaf" + ], + "returns": {}, + "timestamp": 1692129357, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/8453/run-1692129364.json b/broadcast/DeployECDSAValidator.s.sol/8453/run-1692129364.json new file mode 100644 index 00000000..c5c697b1 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/8453/run-1692129364.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x67ac8a2141514ec3391bb8c6828fcc8067ab1da4654fc3be63e29a3c5e61cfaf", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x67ac8a2141514ec3391bb8c6828fcc8067ab1da4654fc3be63e29a3c5e61cfaf", + "transactionIndex": "0x1", + "blockHash": "0x5a40c7c747b5c8d2d35e7ad57b54918ea93d6affaf61a7a8a39172f7cdb975d2", + "blockNumber": "0x28bdb7", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5c1a9", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e33" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129364, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/8453/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/8453/run-latest.json new file mode 100644 index 00000000..c5c697b1 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/8453/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x67ac8a2141514ec3391bb8c6828fcc8067ab1da4654fc3be63e29a3c5e61cfaf", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x67ac8a2141514ec3391bb8c6828fcc8067ab1da4654fc3be63e29a3c5e61cfaf", + "transactionIndex": "0x1", + "blockHash": "0x5a40c7c747b5c8d2d35e7ad57b54918ea93d6affaf61a7a8a39172f7cdb975d2", + "blockNumber": "0x28bdb7", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5c1a9", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e33" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129364, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/84531/run-1692074144.json b/broadcast/DeployECDSAValidator.s.sol/84531/run-1692074144.json new file mode 100644 index 00000000..6abe9035 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/84531/run-1692074144.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xfb7faa1a3a9239c18711ba8f57d2a582e9a45d93f67c912e302adb361f98eec6", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xfb7faa1a3a9239c18711ba8f57d2a582e9a45d93f67c912e302adb361f98eec6" + ], + "returns": {}, + "timestamp": 1692074144, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/84531/run-1692074152.json b/broadcast/DeployECDSAValidator.s.sol/84531/run-1692074152.json new file mode 100644 index 00000000..82401eeb --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/84531/run-1692074152.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xfb7faa1a3a9239c18711ba8f57d2a582e9a45d93f67c912e302adb361f98eec6", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xfb7faa1a3a9239c18711ba8f57d2a582e9a45d93f67c912e302adb361f98eec6", + "transactionIndex": "0x1", + "blockHash": "0x4557834e70285d27e0ebbea327e2ca724a2d6e5be9e26e9cfaf33fd78de8a114", + "blockNumber": "0x80c9ca", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5b369", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692074152, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/84531/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/84531/run-latest.json new file mode 100644 index 00000000..82401eeb --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/84531/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xfb7faa1a3a9239c18711ba8f57d2a582e9a45d93f67c912e302adb361f98eec6", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xfb7faa1a3a9239c18711ba8f57d2a582e9a45d93f67c912e302adb361f98eec6", + "transactionIndex": "0x1", + "blockHash": "0x4557834e70285d27e0ebbea327e2ca724a2d6e5be9e26e9cfaf33fd78de8a114", + "blockNumber": "0x80c9ca", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x5b369", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692074152, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/1/run-1692129664.json b/broadcast/DeployKernel.s.sol/1/run-1692129664.json new file mode 100644 index 00000000..4bb0b2f7 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/1/run-1692129664.json @@ -0,0 +1,75 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129664, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/1/run-1692154809.json b/broadcast/DeployKernel.s.sol/1/run-1692154809.json new file mode 100644 index 00000000..3fafb18d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/1/run-1692154809.json @@ -0,0 +1,78 @@ +{ + "transactions": [ + { + "hash": "0x2577eae4baa9e99168452171c71f30eb70eca9542e3070b5b2918f05f6cd58b3", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdb12bc1c423ffca1eef467ca1344fc82146948aed5105b5482893a4b62cfc953", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x2577eae4baa9e99168452171c71f30eb70eca9542e3070b5b2918f05f6cd58b3", + "0xdb12bc1c423ffca1eef467ca1344fc82146948aed5105b5482893a4b62cfc953" + ], + "returns": {}, + "timestamp": 1692154809, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/1/run-latest.json b/broadcast/DeployKernel.s.sol/1/run-latest.json new file mode 100644 index 00000000..3fafb18d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/1/run-latest.json @@ -0,0 +1,78 @@ +{ + "transactions": [ + { + "hash": "0x2577eae4baa9e99168452171c71f30eb70eca9542e3070b5b2918f05f6cd58b3", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdb12bc1c423ffca1eef467ca1344fc82146948aed5105b5482893a4b62cfc953", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xd", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x2577eae4baa9e99168452171c71f30eb70eca9542e3070b5b2918f05f6cd58b3", + "0xdb12bc1c423ffca1eef467ca1344fc82146948aed5105b5482893a4b62cfc953" + ], + "returns": {}, + "timestamp": 1692154809, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10/run-1692128880.json b/broadcast/DeployKernel.s.sol/10/run-1692128880.json new file mode 100644 index 00000000..3d353bbb --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10/run-1692128880.json @@ -0,0 +1,79 @@ +{ + "transactions": [ + { + "hash": "0x57334f931f37d9dc5f71717631d912d9659ee3cd87925c51c3bc9031540af4a8", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8486c4ec3cd403877ab08bc986bec3042e3a8ad27aad8204a42a1b942446c0bb", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x57334f931f37d9dc5f71717631d912d9659ee3cd87925c51c3bc9031540af4a8", + "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "0x8486c4ec3cd403877ab08bc986bec3042e3a8ad27aad8204a42a1b942446c0bb" + ], + "returns": {}, + "timestamp": 1692128880, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10/run-1692128887.json b/broadcast/DeployKernel.s.sol/10/run-1692128887.json new file mode 100644 index 00000000..7214074e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10/run-1692128887.json @@ -0,0 +1,140 @@ +{ + "transactions": [ + { + "hash": "0x57334f931f37d9dc5f71717631d912d9659ee3cd87925c51c3bc9031540af4a8", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8486c4ec3cd403877ab08bc986bec3042e3a8ad27aad8204a42a1b942446c0bb", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x57334f931f37d9dc5f71717631d912d9659ee3cd87925c51c3bc9031540af4a8", + "transactionIndex": "0x1", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b068a", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb904875a" + }, + { + "transactionHash": "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "transactionIndex": "0x2", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x255ee5", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", + "transactionHash": "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb904875a" + }, + { + "transactionHash": "0x8486c4ec3cd403877ab08bc986bec3042e3a8ad27aad8204a42a1b942446c0bb", + "transactionIndex": "0x3", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x261447", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb904875a" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128887, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10/run-latest.json b/broadcast/DeployKernel.s.sol/10/run-latest.json index e5b42c74..7214074e 100644 --- a/broadcast/DeployKernel.s.sol/10/run-latest.json +++ b/broadcast/DeployKernel.s.sol/10/run-latest.json @@ -1,146 +1,140 @@ { "transactions": [ { - "hash": "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0x57334f931f37d9dc5f71717631d912d9659ee3cd87925c51c3bc9031540af4a8", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { - "type": "0x00", + "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x579d3c", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x1" + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x4", + "accessList": [] }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", - "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", - "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", - "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { - "type": "0x00", + "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0xae7e3", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", - "nonce": "0x2" + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", - "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" - } - ], + "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3", + "hash": "0x8486c4ec3cd403877ab08bc986bec3042e3a8ad27aad8204a42a1b942446c0bb", "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "function": null, - "arguments": null, + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], "transaction": { - "type": "0x00", + "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x54e89", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x3" + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6", + "accessList": [] }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", - "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false } ], "receipts": [ { - "transactionHash": "0x9eabb670d04f8c9f127cba04f297f397c223b46fefca06efbea38edcb8989878", - "transactionIndex": "0x8", - "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", - "blockNumber": "0x6620946", + "transactionHash": "0x57334f931f37d9dc5f71717631d912d9659ee3cd87925c51c3bc9031540af4a8", + "transactionIndex": "0x1", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x5c3993", - "gasUsed": "0x3f6e5d", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b068a", + "gasUsed": "0x1a4f55", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "effectiveGasPrice": "0x787" + "type": "0x2", + "effectiveGasPrice": "0xb904875a" }, { - "transactionHash": "0x0a0059cb41d0fcfe629b750f97cf875ca9be1b9c752a8c0706a8544c820009e4", - "transactionIndex": "0x9", - "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", - "blockNumber": "0x6620946", + "transactionHash": "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "transactionIndex": "0x2", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x641eda", - "gasUsed": "0x7e547", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x255ee5", + "gasUsed": "0xa585b", "contractAddress": null, - "logs": [], + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", + "transactionHash": "0x855251943eeaf197f2167a41c987898f9132b5c50747bba1fa690959c6d038df", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "effectiveGasPrice": "0x787" + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb904875a" }, { - "transactionHash": "0x46db2675757ec201a213cbf532b6827bd8f7a287a93eb0a1f3dcd84c208985b3", - "transactionIndex": "0xa", - "blockHash": "0x19220cefb7a7bf34bbbfa616c50ed177d1eb2752c6a1d1742095933835b8a315", - "blockNumber": "0x6620946", + "transactionHash": "0x8486c4ec3cd403877ab08bc986bec3042e3a8ad27aad8204a42a1b942446c0bb", + "transactionIndex": "0x3", + "blockHash": "0x436842280c2ad22cac65a3b0144694df66faa107cc149d310cb663a10a8d2c9d", + "blockNumber": "0x673fe5c", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x67f669", - "gasUsed": "0x3d78f", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x261447", + "gasUsed": "0xb562", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "effectiveGasPrice": "0x787" + "type": "0x2", + "effectiveGasPrice": "0xb904875a" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1689775178, + "timestamp": 1692128887, "chain": 10, "multi": false, - "commit": "8f0f478" + "commit": "4d26148" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/100/run-1692129436.json b/broadcast/DeployKernel.s.sol/100/run-1692129436.json new file mode 100644 index 00000000..3919a7f3 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/100/run-1692129436.json @@ -0,0 +1,79 @@ +{ + "transactions": [ + { + "hash": "0xb8f55e56e88bc8292fa8ab3a406b5a0b1e203c0afd6c727c393e041edcd4670c", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x98b313bf940ab4d8e837887168f5c603757fb92dceabdee7bee0e5b797fac1e7", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xb8f55e56e88bc8292fa8ab3a406b5a0b1e203c0afd6c727c393e041edcd4670c", + "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "0x98b313bf940ab4d8e837887168f5c603757fb92dceabdee7bee0e5b797fac1e7" + ], + "returns": {}, + "timestamp": 1692129436, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/100/run-1692129443.json b/broadcast/DeployKernel.s.sol/100/run-1692129443.json new file mode 100644 index 00000000..8e219a49 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/100/run-1692129443.json @@ -0,0 +1,140 @@ +{ + "transactions": [ + { + "hash": "0xb8f55e56e88bc8292fa8ab3a406b5a0b1e203c0afd6c727c393e041edcd4670c", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x98b313bf940ab4d8e837887168f5c603757fb92dceabdee7bee0e5b797fac1e7", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb8f55e56e88bc8292fa8ab3a406b5a0b1e203c0afd6c727c393e041edcd4670c", + "transactionIndex": "0x0", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1a5151", + "gasUsed": "0x1a5151", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + }, + { + "transactionHash": "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "transactionIndex": "0x1", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x24aa64", + "gasUsed": "0xa5913", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "transactionHash": "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + }, + { + "transactionHash": "0x98b313bf940ab4d8e837887168f5c603757fb92dceabdee7bee0e5b797fac1e7", + "transactionIndex": "0x2", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x255fc6", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129443, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/100/run-latest.json b/broadcast/DeployKernel.s.sol/100/run-latest.json new file mode 100644 index 00000000..8e219a49 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/100/run-latest.json @@ -0,0 +1,140 @@ +{ + "transactions": [ + { + "hash": "0xb8f55e56e88bc8292fa8ab3a406b5a0b1e203c0afd6c727c393e041edcd4670c", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x98b313bf940ab4d8e837887168f5c603757fb92dceabdee7bee0e5b797fac1e7", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb8f55e56e88bc8292fa8ab3a406b5a0b1e203c0afd6c727c393e041edcd4670c", + "transactionIndex": "0x0", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1a5151", + "gasUsed": "0x1a5151", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + }, + { + "transactionHash": "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "transactionIndex": "0x1", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x24aa64", + "gasUsed": "0xa5913", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "transactionHash": "0x2ae220734b0d82b0a898b326eba63b1e22566c8f0c4b5dc69486f449cf978c02", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + }, + { + "transactionHash": "0x98b313bf940ab4d8e837887168f5c603757fb92dceabdee7bee0e5b797fac1e7", + "transactionIndex": "0x2", + "blockHash": "0xf90749c0a2ee79e85c3ac2e72a3f9861cb6171517ad0894f4cb8f7d70feb5b8c", + "blockNumber": "0x1c1cb8e", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x255fc6", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129443, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10200/run-1692074427.json b/broadcast/DeployKernel.s.sol/10200/run-1692074427.json new file mode 100644 index 00000000..e1c875b6 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10200/run-1692074427.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0x398dbc7f8f8ff7b9e28c57a98450d3d4c1a89c7e5d203ff576554428cc20966f", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x89ff22ee415dcf3cebe0f13c1a578a3fc0cd40dda988183515aa2ad2b9dba82c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xb", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x398dbc7f8f8ff7b9e28c57a98450d3d4c1a89c7e5d203ff576554428cc20966f", + "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", + "0x89ff22ee415dcf3cebe0f13c1a578a3fc0cd40dda988183515aa2ad2b9dba82c", + "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c" + ], + "returns": {}, + "timestamp": 1692074427, + "chain": 10200, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10200/run-1692074434.json b/broadcast/DeployKernel.s.sol/10200/run-1692074434.json new file mode 100644 index 00000000..938607d4 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/10200/run-1692074434.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x398dbc7f8f8ff7b9e28c57a98450d3d4c1a89c7e5d203ff576554428cc20966f", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x89ff22ee415dcf3cebe0f13c1a578a3fc0cd40dda988183515aa2ad2b9dba82c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xb", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x398dbc7f8f8ff7b9e28c57a98450d3d4c1a89c7e5d203ff576554428cc20966f", + "transactionIndex": "0x1", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1ab959", + "gasUsed": "0x1a5151", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", + "transactionIndex": "0x2", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x25126c", + "gasUsed": "0xa5913", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "transactionHash": "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x89ff22ee415dcf3cebe0f13c1a578a3fc0cd40dda988183515aa2ad2b9dba82c", + "transactionIndex": "0x3", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x25c7ce", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + }, + { + "transactionHash": "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c", + "transactionIndex": "0x4", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x270c37", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "transactionHash": "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692074434, + "chain": 10200, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/10200/run-latest.json b/broadcast/DeployKernel.s.sol/10200/run-latest.json index e032f5ea..938607d4 100644 --- a/broadcast/DeployKernel.s.sol/10200/run-latest.json +++ b/broadcast/DeployKernel.s.sol/10200/run-latest.json @@ -1,73 +1,73 @@ { "transactions": [ { - "hash": "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "hash": "0x398dbc7f8f8ff7b9e28c57a98450d3d4c1a89c7e5d203ff576554428cc20966f", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x26dfd0", + "gas": "0x24572d", "value": "0x0", - "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x2", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x8", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "hash": "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0xe0068", + "gas": "0xf2137", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x3", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x9", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "hash": "0x89ff22ee415dcf3cebe0f13c1a578a3fc0cd40dda988183515aa2ad2b9dba82c", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "setImplementation(address,bool)", "arguments": [ - "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "true" ], "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x10945", "value": "0x0", - "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x4", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xa", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "hash": "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "addStake(uint32)", "arguments": [ "1" @@ -75,11 +75,11 @@ "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x1da73", "value": "0x1", "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x5", + "nonce": "0xb", "accessList": [] }, "additionalContracts": [], @@ -88,14 +88,14 @@ ], "receipts": [ { - "transactionHash": "0x758308511db4c38ccd35766ae64ae8f785528a7f12641040e97bc38979c9b1fa", + "transactionHash": "0x398dbc7f8f8ff7b9e28c57a98450d3d4c1a89c7e5d203ff576554428cc20966f", "transactionIndex": "0x1", - "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", - "blockNumber": "0x527145", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x1af9bb", - "gasUsed": "0x1a96ab", + "cumulativeGasUsed": "0x1ab959", + "gasUsed": "0x1a5151", "contractAddress": null, "logs": [], "status": "0x1", @@ -104,45 +104,45 @@ "effectiveGasPrice": "0xb2d05e07" }, { - "transactionHash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "transactionHash": "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", "transactionIndex": "0x2", - "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", - "blockNumber": "0x527145", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x251d7c", - "gasUsed": "0xa23c1", + "cumulativeGasUsed": "0x25126c", + "gasUsed": "0xa5913", "contractAddress": null, "logs": [ { - "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" ], "data": "0x", - "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", - "blockNumber": "0x527145", - "transactionHash": "0x7d8a15f80ae0b28d02740152ef8842cc87965c0edbe86d3360a0131f1c62bd02", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "transactionHash": "0xaffa8315697b2823842311d3882025d6741e4d16b5bf5b782b61afc6164c279e", "transactionIndex": "0x2", "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", "effectiveGasPrice": "0xb2d05e07" }, { - "transactionHash": "0xb48b078bdc590129e14ac8be41c09aefb61f7d9761335f138f6e7f6895493e47", + "transactionHash": "0x89ff22ee415dcf3cebe0f13c1a578a3fc0cd40dda988183515aa2ad2b9dba82c", "transactionIndex": "0x3", - "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", - "blockNumber": "0x527145", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x25d2de", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x25c7ce", "gasUsed": "0xb562", "contractAddress": null, "logs": [], @@ -152,13 +152,13 @@ "effectiveGasPrice": "0xb2d05e07" }, { - "transactionHash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "transactionHash": "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c", "transactionIndex": "0x4", - "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", - "blockNumber": "0x527145", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x271747", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x270c37", "gasUsed": "0x14469", "contractAddress": null, "logs": [ @@ -166,19 +166,19 @@ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "topics": [ "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", - "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x3db282e32eecbd0717ca43878389c5dcd5e61da027dcf0a8332ce693667e972e", - "blockNumber": "0x527145", - "transactionHash": "0xa5f470c9f62f3a4562fbd555647660ffb5b72b1e7d651759c055926a99314cf2", + "blockHash": "0x843530023b4819d0ffda665548efd0a7e5ff74956c8c1a01d22c0547bce5aeaa", + "blockNumber": "0x542130", + "transactionHash": "0x36fe5bc3875e4c28ab45c12d0b1ccaa10969bdaa3275ff977933e881c4b4f57c", "transactionIndex": "0x4", "logIndex": "0x1", "removed": false } ], "status": "0x1", - "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", "type": "0x2", "effectiveGasPrice": "0xb2d05e07" } @@ -186,8 +186,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691520809, + "timestamp": 1692074434, "chain": 10200, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/137/run-1692126883.json b/broadcast/DeployKernel.s.sol/137/run-1692126883.json new file mode 100644 index 00000000..df3b2120 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/137/run-1692126883.json @@ -0,0 +1,76 @@ +{ + "transactions": [ + { + "hash": "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1d" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x1e" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8" + ], + "returns": {}, + "timestamp": 1692126883, + "chain": 137, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/137/run-1692126890.json b/broadcast/DeployKernel.s.sol/137/run-1692126890.json new file mode 100644 index 00000000..a0a7a350 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/137/run-1692126890.json @@ -0,0 +1,187 @@ +{ + "transactions": [ + { + "hash": "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1c" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1d" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x1e" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "transactionIndex": "0x20", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x69a125", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000009ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0" + ], + "data": "0x00000000000000000000000000000000000000000000000001892035e4ba8f690000000000000000000000000000000000000000000000173c63333bad6d4feb00000000000000000000000000000000000000000000046823a4b9f19ed1e3f60000000000000000000000000000000000000000000000173ada1305c8b2c082000000000000000000000000000000000000000000000468252dda27838c735f", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "transactionIndex": "0x20", + "logIndex": "0x81", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000040000000040000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x82898464bc" + }, + { + "transactionHash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionIndex": "0x21", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x73f980", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionIndex": "0x21", + "logIndex": "0x82", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000009ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0" + ], + "data": "0x000000000000000000000000000000000000000000000000009a9412babd4b070000000000000000000000000000000000000000000000172ef8c801ee49d97f000000000000000000000000000000000000000000000468252dda27838c735f0000000000000000000000000000000000000000000000172e5e33ef338c8e7800000000000000000000000000000000000000000000046825c86e3a3e49be66", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionIndex": "0x21", + "logIndex": "0x83", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000200000000020000000000000000000800000000000000000080000000000000400040000000040000000000000080000000000000000000000000080000000000201000100000000000000000000000000000000000000000000000000000004000000000000000000001400000000000000000000000000000120000000020000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x82898464bc" + }, + { + "transactionHash": "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8", + "transactionIndex": "0x22", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x74aee2", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000009ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0" + ], + "data": "0x000000000000000000000000000000000000000000000000000a963ee3da226a00000000000000000000000000000000000000000000001729b25b299a416aab00000000000000000000000000000000000000000000046825c86e3a3e49be6600000000000000000000000000000000000000000000001729a7c4eab667484100000000000000000000000000000000000000000000046825d304792223e0d0", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8", + "transactionIndex": "0x22", + "logIndex": "0x84", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000040000000040000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x82898464bc" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692126890, + "chain": 137, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/137/run-latest.json b/broadcast/DeployKernel.s.sol/137/run-latest.json index 42fd9830..a0a7a350 100644 --- a/broadcast/DeployKernel.s.sol/137/run-latest.json +++ b/broadcast/DeployKernel.s.sol/137/run-latest.json @@ -1,101 +1,76 @@ { "transactions": [ { - "hash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x579d3c", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x19" + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1c" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", - "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", - "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", - "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0xae7e3", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", - "nonce": "0x1a" + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1d" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", - "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" - } - ], + "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", + "hash": "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8", "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "function": null, - "arguments": null, + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x54e89", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x1b" + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x1e" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", - "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false } ], "receipts": [ { - "transactionHash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", - "transactionIndex": "0x36", - "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", - "blockNumber": "0x2b2b83e", + "transactionHash": "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "transactionIndex": "0x20", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0xbdaa0b", - "gasUsed": "0x3f6e5d", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x69a125", + "gasUsed": "0x1a4f55", "contractAddress": null, "logs": [ { @@ -104,64 +79,79 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + "0x0000000000000000000000009ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0" ], - "data": "0x00000000000000000000000000000000000000000000000001e904f9a9a1ff80000000000000000000000000000000000000000000000017451a7931b4f48dff0000000000000000000000000000000000000000000005508352d4c416444aa0000000000000000000000000000000000000000000000017433174380b528e7f000000000000000000000000000000000000000000000550853bd9bdbfe64a20", - "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", - "blockNumber": "0x2b2b83e", - "transactionHash": "0x75064fa7b55e12f7f54f76175cf75b906a25591c3544ac5890048b5bf6c51095", - "transactionIndex": "0x36", - "logIndex": "0xd9", + "data": "0x00000000000000000000000000000000000000000000000001892035e4ba8f690000000000000000000000000000000000000000000000173c63333bad6d4feb00000000000000000000000000000000000000000000046823a4b9f19ed1e3f60000000000000000000000000000000000000000000000173ada1305c8b2c082000000000000000000000000000000000000000000000468252dda27838c735f", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0x065fc8dbbdb0d0025746f8845aeee4f3e25c9af344319280ba99de537c0cc502", + "transactionIndex": "0x20", + "logIndex": "0x81", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000040000000040000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0x1daefb699c" + "effectiveGasPrice": "0x82898464bc" }, { - "transactionHash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", - "transactionIndex": "0x37", - "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", - "blockNumber": "0x2b2b83e", + "transactionHash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionIndex": "0x21", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0xc58f52", - "gasUsed": "0x7e547", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x73f980", + "gasUsed": "0xa585b", "contractAddress": null, "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionIndex": "0x21", + "logIndex": "0x82", + "removed": false + }, { "address": "0x0000000000000000000000000000000000001010", "topics": [ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + "0x0000000000000000000000009ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0" ], - "data": "0x000000000000000000000000000000000000000000000000003cdef3c58606800000000000000000000000000000000000000000000000173dbf9d5a1eda2853000000000000000000000000000000000000000000000550853bd9bdbfe64a200000000000000000000000000000000000000000000000173d82be66595421d30000000000000000000000000000000000000000000005508578b8b1856c50a0", - "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", - "blockNumber": "0x2b2b83e", - "transactionHash": "0xe56c3692b28b039b2f4c915f5f2a69a25b84f2f524d2e2e7cef37e5f1d4a2bcc", - "transactionIndex": "0x37", - "logIndex": "0xda", + "data": "0x000000000000000000000000000000000000000000000000009a9412babd4b070000000000000000000000000000000000000000000000172ef8c801ee49d97f000000000000000000000000000000000000000000000468252dda27838c735f0000000000000000000000000000000000000000000000172e5e33ef338c8e7800000000000000000000000000000000000000000000046825c86e3a3e49be66", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0xaeba92f943fe6614738285d5ae544a7b07cebca33d54acfa0f0537513b237917", + "transactionIndex": "0x21", + "logIndex": "0x83", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000200000000020000000000000000000800000000000000000080000000000000400040000000040000000000000080000000000000000000000000080000000000201000100000000000000000000000000000000000000000000000000000004000000000000000000001400000000000000000000000000000120000000020000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0x1daefb699c" + "effectiveGasPrice": "0x82898464bc" }, { - "transactionHash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", - "transactionIndex": "0x39", - "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", - "blockNumber": "0x2b2b83e", + "transactionHash": "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8", + "transactionIndex": "0x22", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0xca3a5e", - "gasUsed": "0x3d78f", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x74aee2", + "gasUsed": "0xb562", "contractAddress": null, "logs": [ { @@ -170,28 +160,28 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x000000000000000000000000f0245f6251bef9447a08766b9da2b07b28ad80b0" + "0x0000000000000000000000009ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0" ], - "data": "0x000000000000000000000000000000000000000000000000001d9eb411f292800000000000000000000000000000000000000000000000173cd53eb7ce63520f000000000000000000000000000000000000000000000550857f1727459a80200000000000000000000000000000000000000000000000173cb7a003bc70bf8f000000000000000000000000000000000000000000000550859cb5db578d12a0", - "blockHash": "0xbbf7eae36c9bd84a51988fd7a7c7cc3f845d6906fe38821f47be3fbf4e057d46", - "blockNumber": "0x2b2b83e", - "transactionHash": "0xfb87295b680415be2096ab6edd218d81d9345b0d47659c9d8ee03ffc6c71384e", - "transactionIndex": "0x39", - "logIndex": "0xdc", + "data": "0x000000000000000000000000000000000000000000000000000a963ee3da226a00000000000000000000000000000000000000000000001729b25b299a416aab00000000000000000000000000000000000000000000046825c86e3a3e49be6600000000000000000000000000000000000000000000001729a7c4eab667484100000000000000000000000000000000000000000000046825d304792223e0d0", + "blockHash": "0xa2aa706d899ad4fad48518b8bb52b55c843dfeb8eb6c692be85711c3b28c8ff5", + "blockNumber": "0x2c333b3", + "transactionHash": "0x141924b7e3b1e601e761d6b52b103addd171e54bba1c2b550426d8091fcd8bd8", + "transactionIndex": "0x22", + "logIndex": "0x84", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000080000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000080000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000040000000040000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0x1daefb699c" + "effectiveGasPrice": "0x82898464bc" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1689775110, + "timestamp": 1692126890, "chain": 137, "multi": false, - "commit": "8f0f478" + "commit": "c78ecd8" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/420/run-1692073665.json b/broadcast/DeployKernel.s.sol/420/run-1692073665.json new file mode 100644 index 00000000..e8fab37f --- /dev/null +++ b/broadcast/DeployKernel.s.sol/420/run-1692073665.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0xe8fd691147cbc247caa40366af428f2d9f5b3e9205a0a473030eec43aeec3bfd", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe936cc1816814fb8729b689d06e528f9b47450143632e8ae0ee53fc3b227a445", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xe8fd691147cbc247caa40366af428f2d9f5b3e9205a0a473030eec43aeec3bfd", + "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", + "0xe936cc1816814fb8729b689d06e528f9b47450143632e8ae0ee53fc3b227a445", + "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b" + ], + "returns": {}, + "timestamp": 1692073665, + "chain": 420, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/420/run-1692073672.json b/broadcast/DeployKernel.s.sol/420/run-1692073672.json new file mode 100644 index 00000000..ed9569b6 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/420/run-1692073672.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0xe8fd691147cbc247caa40366af428f2d9f5b3e9205a0a473030eec43aeec3bfd", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe936cc1816814fb8729b689d06e528f9b47450143632e8ae0ee53fc3b227a445", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe8fd691147cbc247caa40366af428f2d9f5b3e9205a0a473030eec43aeec3bfd", + "transactionIndex": "0x1", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b0666", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", + "transactionIndex": "0x2", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x255ec1", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "transactionHash": "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0xe936cc1816814fb8729b689d06e528f9b47450143632e8ae0ee53fc3b227a445", + "transactionIndex": "0x3", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x261423", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b", + "transactionIndex": "0x4", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x27588c", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "transactionHash": "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692073672, + "chain": 420, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/420/run-latest.json b/broadcast/DeployKernel.s.sol/420/run-latest.json index 50b0a859..ed9569b6 100644 --- a/broadcast/DeployKernel.s.sol/420/run-latest.json +++ b/broadcast/DeployKernel.s.sol/420/run-latest.json @@ -1,73 +1,73 @@ { "transactions": [ { - "hash": "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "hash": "0xe8fd691147cbc247caa40366af428f2d9f5b3e9205a0a473030eec43aeec3bfd", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x26dfd0", + "gas": "0x24572d", "value": "0x0", - "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "hash": "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0xe0068", + "gas": "0xf2137", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x1", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "hash": "0xe936cc1816814fb8729b689d06e528f9b47450143632e8ae0ee53fc3b227a445", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "setImplementation(address,bool)", "arguments": [ - "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "true" ], "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x10945", "value": "0x0", - "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x2", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "hash": "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "addStake(uint32)", "arguments": [ "1" @@ -75,11 +75,11 @@ "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x1da73", "value": "0x1", "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x3", + "nonce": "0x8", "accessList": [] }, "additionalContracts": [], @@ -88,77 +88,77 @@ ], "receipts": [ { - "transactionHash": "0x7b6c66e3348524ea9e0b538e4ac466c28cc733b1e7f813a0cfa6498136eb0956", + "transactionHash": "0xe8fd691147cbc247caa40366af428f2d9f5b3e9205a0a473030eec43aeec3bfd", "transactionIndex": "0x1", - "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", - "blockNumber": "0xc70d12", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x1b4bde", - "gasUsed": "0x1a94a9", + "cumulativeGasUsed": "0x1b0666", + "gasUsed": "0x1a4f55", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0xb2d05e34" + "effectiveGasPrice": "0xb2d05e32" }, { - "transactionHash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "transactionHash": "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", "transactionIndex": "0x2", - "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", - "blockNumber": "0xc70d12", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x256eeb", - "gasUsed": "0xa230d", + "cumulativeGasUsed": "0x255ec1", + "gasUsed": "0xa585b", "contractAddress": null, "logs": [ { - "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" ], "data": "0x", - "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", - "blockNumber": "0xc70d12", - "transactionHash": "0x78d0844c4cc5917977e0ba2b6eba8294244907609207705b7d40b1be358f7a9e", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "transactionHash": "0xd5ddbe4660caa47a02e09ebc1a1eec6fabe1f5cbfad13051cef12c558401194f", "transactionIndex": "0x2", "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0xb2d05e34" + "effectiveGasPrice": "0xb2d05e32" }, { - "transactionHash": "0x8e29d3458e2d9679899836b01f6606e52a63f697e7c4ba94eabb6a6b2e79799a", + "transactionHash": "0xe936cc1816814fb8729b689d06e528f9b47450143632e8ae0ee53fc3b227a445", "transactionIndex": "0x3", - "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", - "blockNumber": "0xc70d12", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x26244d", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x261423", "gasUsed": "0xb562", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0xb2d05e34" + "effectiveGasPrice": "0xb2d05e32" }, { - "transactionHash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "transactionHash": "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b", "transactionIndex": "0x4", - "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", - "blockNumber": "0xc70d12", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x2768b6", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x27588c", "gasUsed": "0x14469", "contractAddress": null, "logs": [ @@ -166,28 +166,28 @@ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "topics": [ "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", - "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x1ce4c3775cc377a944f9214afa1e610c78c67263bda549b0e5e52c3936fe89f5", - "blockNumber": "0xc70d12", - "transactionHash": "0x30cf501835155a69c4b1e11ce8d908053faf84e121b732cddeb028ee7f661718", + "blockHash": "0x6bf93962791af8c3823047e082c177e678134398c95c58015ac64bd67c392dd4", + "blockNumber": "0xcb4a2f", + "transactionHash": "0x54eaef3f8424768c6eff4b449cfb054f67500f65b556066a2b1ea4d56cd4532b", "transactionIndex": "0x4", "logIndex": "0x1", "removed": false } ], "status": "0x1", - "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0xb2d05e34" + "effectiveGasPrice": "0xb2d05e32" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691518093, + "timestamp": 1692073672, "chain": 420, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/42161/run-1692128723.json b/broadcast/DeployKernel.s.sol/42161/run-1692128723.json new file mode 100644 index 00000000..f1628526 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/42161/run-1692128723.json @@ -0,0 +1,137 @@ +{ + "transactions": [ + { + "hash": "0xe2424c6761fcda5b23b16a4ff313daf88b0608dfc81c0214afde05e3631e1e90", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4000fe8", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdc255dade91c999097a8339cf7d4da3be827a2f62a48e12fd54165d507aefe1b", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1c4d384", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdac570fea6789cb52b99ec2a4f85ef10873cff87113b59c5a297e57a511a3c0f", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x2a1377", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe2424c6761fcda5b23b16a4ff313daf88b0608dfc81c0214afde05e3631e1e90", + "transactionIndex": "0x1", + "blockHash": "0xc52004ed12850b11eed88216a2231e23408551f15dfc1bfc0c093f88d28c2187", + "blockNumber": "0x7417037", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2c2f701", + "gasUsed": "0x2c2f701", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xdc255dade91c999097a8339cf7d4da3be827a2f62a48e12fd54165d507aefe1b", + "transactionIndex": "0x1", + "blockHash": "0x719862c188c3862f95be81ffb88960dd333d60f31b484e158b95f6e4ef046388", + "blockNumber": "0x741703f", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x13691c8", + "gasUsed": "0x13691c8", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x719862c188c3862f95be81ffb88960dd333d60f31b484e158b95f6e4ef046388", + "blockNumber": "0x741703f", + "transactionHash": "0xdc255dade91c999097a8339cf7d4da3be827a2f62a48e12fd54165d507aefe1b", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xdac570fea6789cb52b99ec2a4f85ef10873cff87113b59c5a297e57a511a3c0f", + "transactionIndex": "0x1", + "blockHash": "0x2a53fc3f4988c2bd621f3e87e4cb2781379a80bd926ef46e60e56444c02d19ec", + "blockNumber": "0x7417047", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x1927ac", + "gasUsed": "0x1927ac", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128723, + "chain": 42161, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/42161/run-latest.json b/broadcast/DeployKernel.s.sol/42161/run-latest.json index b298386a..f1628526 100644 --- a/broadcast/DeployKernel.s.sol/42161/run-latest.json +++ b/broadcast/DeployKernel.s.sol/42161/run-latest.json @@ -1,101 +1,76 @@ { "transactions": [ { - "hash": "0x35be988ef20d7b2c3d5ce60fd428a3df7f28a9a2eb632443436b943b77247907", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0xe2424c6761fcda5b23b16a4ff313daf88b0608dfc81c0214afde05e3631e1e90", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x2e0f95b", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4000fe8", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x6" + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xa" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x12358cA00141D09cB90253F05a1DD16bE93A8EE6", - "initCode": "60e060405234801561001057600080fd5b50604051614dea380380614dea83398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b5080610abe83390190565b6127dc8061260e83390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995", - "initCode": "61016060405234801561001157600080fd5b50604051611b50380380611b5083398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e05161010051610120516101405161198f6101c1600039600081816102df01526104a40152600061107a015260006110c9015260006110a401526000610ffd0152600061102701526000611051015261198f6000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f1461027957806354fd4d501461029c578063b0d691fe146102cd578063cf7a1d77146103195761007b565b806306fdde03146101ca5780631626ba7e146102125780633a871cdd1461024b5761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b5610339565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f2906002880190600401611151565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c95955690610171906003300190600401611151565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b3660008037600080366000875af43d6000803e8080156101c3573d6000f35b3d6000fd5b005b3480156101d657600080fd5b506101fc6040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102099190611222565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611277565b61036d565b6040516001600160e01b03199091168152602001610209565b34801561025757600080fd5b5061026b6102663660046112c3565b610497565b604051908152602001610209565b34801561028557600080fd5b5061028e6107ec565b604051610209929190611317565b3480156102a857600080fd5b506101fc60405180604001604052806005815260200164181718171960d91b81525081565b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561032557600080fd5b506101c861033436600461136b565b610895565b60008061036760017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96113e6565b92915050565b6000806103e661037b610339565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b8787876040516024016103af93929190611422565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a00565b9150506000818060200190518101906103ff9190611445565b9050600061040c82610a54565b905042816020015165ffffffffffff16111561043657506001600160e01b03199250610490915050565b42816040015165ffffffffffff16101561045e57506001600160e01b03199250610490915050565b80516001600160a01b03161561048257506001600160e01b03199250610490915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105165760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e740000000060448201526064015b60405180910390fd5b600061052661014086018661145e565b610535916004916000916114a5565b61053e916114cf565b9050600061054b866115cc565b905060008061055d606089018961145e565b61056c916004916000916114a5565b610575916114cf565b90506001600160e01b0319841660000361060d57610592886115cc565b92506105a261014089018961145e565b6105b09160049082906114a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526105f2610339565b60010154600160501b90046001600160a01b0316915061074a565b6001600160e01b03198416600160e11b0361073d5761063061014089018961145e565b61063f916024916010916114a5565b610648916116db565b60601c91503660008181610669856106646101408f018f61145e565b610ac5565b604051949d509297509095509350915060009061069b90889063064acaab60e11b906103af908990899060240161170e565b509050806106f65760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b606482015260840161050d565b82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408901525061074a9350505050565b6001945050505050610490565b851561079c57604051600090339088908381818185875af1925050503d8060008114610792576040519150601f19603f3d011682016040523d82523d6000602084013e610797565b606091505b505050505b60006107bf83633a871cdd60e01b868b8b6040516024016103af93929190611722565b9150506107df86828060200190518101906107da9190611445565b610ecf565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061081090611117565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90611117565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505050509150509091565b600061089f610339565b6001810154909150600160501b90046001600160a01b0316156109045760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161050d565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b03929092169190911790558282306002019161097191908361185f565b50600061099386630c95955660e01b86866040516024016103af92919061170e565b509050806109f85760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b606482015260840161050d565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e909250905081610a4d578060405162461bcd60e51b815260040161050d9190611222565b9250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610a90575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610ada60586038898b6114a5565b610ae391611920565b905087605888610af3848361193e565b92610b00939291906114a5565b909550935060008888610b1484605861193e565b90610b2085607861193e565b92610b2d939291906114a5565b610b3691611920565b60001c90506000610c177f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610b76939291906114a5565b610b7f91611920565b60001c8d8d602490603892610b96939291906114a5565b610b9f916116db565b60601c8b8b604051610bb2929190611951565b604051908190038120610bfc95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fa2565b90506000610c86610c26610339565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610c508a607861193e565b9089610c5d8c607861193e565b610c67919061193e565b92610c74939291906114a5565b6040516024016103af93929190611422565b915050610cd681806020019051810190610ca09190611445565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610cc7939291906114a5565b610cd091611920565b16610ecf565b98508a8a84610ce687607861193e565b610cf0919061193e565b610cfb9282906114a5565b9550955060405180608001604052808c8c600490600a92610d1e939291906114a5565b610d2791611961565b60d01c65ffffffffffff1681526020018c8c600a90601092610d4b939291906114a5565b610d5491611961565b60d01c65ffffffffffff1681526020018c8c602490603892610d78939291906114a5565b610d81916116db565b60601c6001600160a01b031681526020018c8c601090602492610da6939291906114a5565b610daf916116db565b60601c9052610dbc610339565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610e67602460108c8e6114a5565b610e70916116db565b60013090810180546001600160a01b03191660609390931c92909217909155600301610e9d888a8361185f565b50888b60588c610ead888361193e565b92610eba939291906114a5565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610ef257506001610367565b60d083901c60a084901c65ffffffffffff8116600003610f15575065ffffffffffff5b60d084901c60a085901c65ffffffffffff8116600003610f38575065ffffffffffff5b8165ffffffffffff168465ffffffffffff161015610f54578193505b8065ffffffffffff168365ffffffffffff161115610f70578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b6000610367610faf610ff0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561104957507f000000000000000000000000000000000000000000000000000000000000000046145b1561107357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061112b57607f821691505b60208210810361114b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461116581611117565b8084870152604060018084166000811461118657600181146111a0576111ce565b60ff1985168984015283151560051b8901830195506111ce565b896000528660002060005b858110156111c65781548b82018601529083019088016111ab565b8a0184019650505b509398975050505050505050565b6000815180845260005b81811015611202576020818501810151868301820152016111e6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061049060208301846111dc565b60008083601f84011261124757600080fd5b50813567ffffffffffffffff81111561125f57600080fd5b602083019150836020828501011115610a4d57600080fd5b60008060006040848603121561128c57600080fd5b83359250602084013567ffffffffffffffff8111156112aa57600080fd5b6112b686828701611235565b9497909650939450505050565b6000806000606084860312156112d857600080fd5b833567ffffffffffffffff8111156112ef57600080fd5b8401610160818703121561130257600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061133b908301846111dc565b949350505050565b6001600160a01b038116811461135857600080fd5b50565b803561136681611343565b919050565b6000806000806060858703121561138157600080fd5b843561138c81611343565b9350602085013561139c81611343565b9250604085013567ffffffffffffffff8111156113b857600080fd5b6113c487828801611235565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610367576103676113d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061143c6040830184866113f9565b95945050505050565b60006020828403121561145757600080fd5b5051919050565b6000808335601e1984360301811261147557600080fd5b83018035915067ffffffffffffffff82111561149057600080fd5b602001915036819003821315610a4d57600080fd5b600080858511156114b557600080fd5b838611156114c257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156114f75780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff81118282101715611539576115396114ff565b60405290565b600082601f83011261155057600080fd5b813567ffffffffffffffff8082111561156b5761156b6114ff565b604051601f8301601f19908116603f01168101908282118183101715611593576115936114ff565b816040528381528660208588010111156115ac57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156115df57600080fd5b6115e7611515565b6115f08361135b565b815260208301356020820152604083013567ffffffffffffffff8082111561161757600080fd5b6116233683870161153f565b6040840152606085013591508082111561163c57600080fd5b6116483683870161153f565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561169857600080fd5b6116a43682880161153f565b8385015250610140915081850135818111156116bf57600080fd5b6116cb3682880161153f565b8385015250505080915050919050565b6bffffffffffffffffffffffff1981358181169160148510156114f75760149490940360031b84901b1690921692915050565b60208152600061133b6020830184866113f9565b6060815261173c6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117646101c08501836111dc565b91506060870151605f19808685030160c087015261178284836111dc565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526117de87876111dc565b9650808c0151955050505080868503016101a0870152505061180082826111dc565b602085019690965250505060400152919050565b601f82111561185a57600081815260208120601f850160051c8101602086101561183b5750805b601f850160051c820191505b818110156109f857828155600101611847565b505050565b67ffffffffffffffff831115611877576118776114ff565b61188b836118858354611117565b83611814565b6000601f8411600181146118bf57600085156118a75750838201355b600019600387901b1c1916600186901b178355611919565b600083815260209020601f19861690835b828110156118f057868501358255602094850194600190920191016118d0565b508682101561190d5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8035602083101561036757600019602084900360031b1b1692915050565b80820180821115610367576103676113d0565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156114f75760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - }, - { - "transactionType": "CREATE", - "address": "0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957", - "initCode": "6101606040523480156200001257600080fd5b50604051620027dc380380620027dc83398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125606200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a7d01526000611acc01526000611aa701526000611a0001526000611a2a01526000611a5401526125606000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b60565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611be3565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c55565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611cce565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d68565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d85565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611dd8565b610e33565b34801561038a57600080fd5b5061039e610399366004611e01565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611e1c565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e93565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611f12565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e93565b6112aa565b34801561054157600080fd5b50610214610550366004611e01565b61139e565b34801561056157600080fd5b506102b7610570366004611fd0565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612061565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f9088908890889060040161209d565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066091906120c0565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120d9565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c959556906108499085908590600401612126565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120d9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a00610140860186612142565b610a0f91600491600091612188565b610a18916121b2565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a85866122ad565b9050600080610a976060890189612142565b610aa691600491600091612188565b610aaf916121b2565b90506001600160e01b03198416600003610b4757610acc886122ad565b9250610adc610140890189612142565b610aea916004908290612188565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a612142565b610bd5916004908290612188565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c60610140890189612142565b610c6f91602491601091612188565b610c78916123bb565b60601c91503660008181610c9985610c946101408f018f612142565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd49087908790600401612126565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123e9565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906120c0565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906120c0565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124db565b036110465761103c8786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193792505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196d92505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120d9565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a591906120c0565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a29086908690600401612126565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120d9565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612188565b6114d1916124f1565b9050876058886114e1848361250f565b926114ee93929190612188565b90955093506000888861150284605861250f565b9061150e85607861250f565b9261151b93929190612188565b611524916124f1565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612188565b61156d916124f1565b60001c8d8d60249060389261158493929190612188565b61158d916123bb565b60601c8b8b6040516115a0929190612522565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b604051602081830303815290604052805190602001206119a5565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d61163989607861250f565b90886116468b607861250f565b611650919061250f565b9261165d93929190612188565b6040518463ffffffff1660e01b815260040161167b9392919061209d565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc91906120c0565b60a06001600160601b038016901b8c8c6004906024926116de93929190612188565b6116e7916124f1565b16611864565b97508989836116fd86607861250f565b611707919061250f565b611712928290612188565b6040805160808101909152919650945080611731600a60048d8f612188565b61173a91612532565b60d01c81526020016117506010600a8d8f612188565b61175991612532565b60d01c815260200161176f603860248d8f612188565b611778916123bb565b60601c815260200161178e602460108d8f612188565b611797916123bb565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b611843878361250f565b9261185093929190612188565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60d083901c60a084901c65ffffffffffff81166000036118aa575065ffffffffffff5b60d084901c60a085901c65ffffffffffff81166000036118cd575065ffffffffffff5b8165ffffffffffff168465ffffffffffff1610156118e9578193505b8065ffffffffffff168365ffffffffffff161115611905578092505b60d08465ffffffffffff16901b60a08465ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b06119b26119f3565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a4c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a7657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b4057602081850181015186830182015201611b24565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611b1a565b6001600160a01b0381168114611b8857600080fd5b50565b8035611b9681611b73565b919050565b60008083601f840112611bad57600080fd5b5081356001600160401b03811115611bc457600080fd5b602083019150836020828501011115611bdc57600080fd5b9250929050565b600080600080600060808688031215611bfb57600080fd5b8535611c0681611b73565b94506020860135611c1681611b73565b93506040860135925060608601356001600160401b03811115611c3857600080fd5b611c4488828901611b9b565b969995985093965092949392505050565b600080600060408486031215611c6a57600080fd5b8335925060208401356001600160401b03811115611c8757600080fd5b611c9386828701611b9b565b9497909650939450505050565b80356001600160e01b031981168114611b9657600080fd5b803565ffffffffffff81168114611b9657600080fd5b600080600080600080600060c0888a031215611ce957600080fd5b611cf288611ca0565b96506020880135611d0281611b73565b95506040880135611d1281611b73565b9450611d2060608901611cb8565b9350611d2e60808901611cb8565b925060a08801356001600160401b03811115611d4957600080fd5b611d558a828b01611b9b565b989b979a50959850939692959293505050565b600060208284031215611d7a57600080fd5b81356106ed81611b73565b600080600060608486031215611d9a57600080fd5b83356001600160401b03811115611db057600080fd5b84016101608187031215611dc357600080fd5b95602085013595506040909401359392505050565b600060208284031215611dea57600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611e1357600080fd5b6106ed82611ca0565b600080600080600060808688031215611e3457600080fd5b8535611e3f81611b73565b94506020860135935060408601356001600160401b03811115611e6157600080fd5b611e6d88828901611b9b565b909450925050606086013560028110611e8557600080fd5b809150509295509295909350565b600080600060408486031215611ea857600080fd5b8335611eb381611b73565b925060208401356001600160401b03811115611c8757600080fd5b60008083601f840112611ee057600080fd5b5081356001600160401b03811115611ef757600080fd5b6020830191508360208260051b8501011115611bdc57600080fd5b60008060008060008060008060a0898b031215611f2e57600080fd5b8835611f3981611b73565b97506020890135611f4981611b73565b965060408901356001600160401b0380821115611f6557600080fd5b611f718c838d01611ece565b909850965060608b0135915080821115611f8a57600080fd5b611f968c838d01611ece565b909650945060808b0135915080821115611faf57600080fd5b50611fbc8b828c01611b9b565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fe957600080fd5b8635611ff481611b73565b9550602087013561200481611b73565b9450604087013593506060870135925060808701356001600160401b0381111561202d57600080fd5b61203989828a01611b9b565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b061204b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006120b7604083018486612074565b95945050505050565b6000602082840312156120d257600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061213a602083018486612074565b949350505050565b6000808335601e1984360301811261215957600080fd5b8301803591506001600160401b0382111561217357600080fd5b602001915036819003821315611bdc57600080fd5b6000808585111561219857600080fd5b838611156121a557600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121da5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561221b5761221b6121e2565b60405290565b600082601f83011261223257600080fd5b81356001600160401b038082111561224c5761224c6121e2565b604051601f8301601f19908116603f01168101908282118183101715612274576122746121e2565b8160405283815286602085880101111561228d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061016082360312156122c057600080fd5b6122c86121f8565b6122d183611b8b565b81526020830135602082015260408301356001600160401b03808211156122f757600080fd5b61230336838701612221565b6040840152606085013591508082111561231c57600080fd5b61232836838701612221565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561237857600080fd5b61238436828801612221565b83850152506101409150818501358181111561239f57600080fd5b6123ab36828801612221565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121da5760149490940360031b84901b1690921692915050565b606081526124036060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a085015261242b6101c0850183611b1a565b91506060870151605f19808685030160c08701526124498483611b1a565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526124a58787611b1a565b9650808c0151955050505080868503016101a087015250506124c78282611b1a565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b061204b565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121da5760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xecfe7d83900b6e8dde0c911bbbd07a64a28485b998be927fbe20dc9a246c0af2", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", + "hash": "0xdc255dade91c999097a8339cf7d4da3be827a2f62a48e12fd54165d507aefe1b", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x79237e", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1c4d384", "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd", - "nonce": "0x7" + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xb" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", - "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" - } - ], + "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xa389bc1915140b56b3bb51321d39ab6c70821a8a7e648d0eecb5e80757696048", + "hash": "0xdac570fea6789cb52b99ec2a4f85ef10873cff87113b59c5a297e57a511a3c0f", "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "function": null, - "arguments": null, + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x7a0d94f55792c434d74a40883c6ed8545e406d12", - "gas": "0x48783b", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x2a1377", "value": "0x0", - "data": "0x60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x8" + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc" }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "address": "0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE", - "initCode": "60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b93925050505600000000000000000000000012358ca00141d09cb90253f05a1dd16be93a8ee6000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" - } - ], + "additionalContracts": [], "isFixedGasLimit": false } ], "receipts": [ { - "transactionHash": "0x35be988ef20d7b2c3d5ce60fd428a3df7f28a9a2eb632443436b943b77247907", - "transactionIndex": "0x3", - "blockHash": "0x85eae4d51e47387d9a033d205a3f3bc49edeb92822c73e872e599630966f79c1", - "blockNumber": "0x6b97ab8", + "transactionHash": "0xe2424c6761fcda5b23b16a4ff313daf88b0608dfc81c0214afde05e3631e1e90", + "transactionIndex": "0x1", + "blockHash": "0xc52004ed12850b11eed88216a2231e23408551f15dfc1bfc0c093f88d28c2187", + "blockNumber": "0x7417037", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x21ffa48", - "gasUsed": "0x2024944", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2c2f701", + "gasUsed": "0x2c2f701", "contractAddress": null, "logs": [], "status": "0x1", @@ -104,30 +79,46 @@ "effectiveGasPrice": "0x5f5e100" }, { - "transactionHash": "0xecfe7d83900b6e8dde0c911bbbd07a64a28485b998be927fbe20dc9a246c0af2", - "transactionIndex": "0x3", - "blockHash": "0x3ef3416c8cb57caf4c5bf4d9c40107b60ec3edff35c00ee636ad1a2ccbae383d", - "blockNumber": "0x6b97adb", + "transactionHash": "0xdc255dade91c999097a8339cf7d4da3be827a2f62a48e12fd54165d507aefe1b", + "transactionIndex": "0x1", + "blockHash": "0x719862c188c3862f95be81ffb88960dd333d60f31b484e158b95f6e4ef046388", + "blockNumber": "0x741703f", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x6a3bf2", - "gasUsed": "0x52ef19", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x13691c8", + "gasUsed": "0x13691c8", "contractAddress": null, - "logs": [], + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x719862c188c3862f95be81ffb88960dd333d60f31b484e158b95f6e4ef046388", + "blockNumber": "0x741703f", + "transactionHash": "0xdc255dade91c999097a8339cf7d4da3be827a2f62a48e12fd54165d507aefe1b", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x0", "effectiveGasPrice": "0x5f5e100" }, { - "transactionHash": "0xa389bc1915140b56b3bb51321d39ab6c70821a8a7e648d0eecb5e80757696048", - "transactionIndex": "0x3", - "blockHash": "0x3bc7239d0b5f2097b1e94be8c6f3eb147c6723e732280f60a069902c8e41873e", - "blockNumber": "0x6b97ae3", + "transactionHash": "0xdac570fea6789cb52b99ec2a4f85ef10873cff87113b59c5a297e57a511a3c0f", + "transactionIndex": "0x1", + "blockHash": "0x2a53fc3f4988c2bd621f3e87e4cb2781379a80bd926ef46e60e56444c02d19ec", + "blockNumber": "0x7417047", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x7A0D94F55792C434d74a40883C6ed8545E406D12", - "cumulativeGasUsed": "0x4c9cd7", - "gasUsed": "0x309889", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x1927ac", + "gasUsed": "0x1927ac", "contractAddress": null, "logs": [], "status": "0x1", @@ -139,8 +130,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1689775225, + "timestamp": 1692128723, "chain": 42161, "multi": false, - "commit": "8f0f478" + "commit": "4d26148" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-1692072403.json b/broadcast/DeployKernel.s.sol/421613/run-1692072403.json new file mode 100644 index 00000000..6cc97267 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/421613/run-1692072403.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0xbe0aa7865435f15efbe859b40daeda58a9a687a50a954ecd512bfc47113efffe", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x22b045", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8cc8507530779188dc7adff2a45384cd907cf51c719197742a7b91eca6320957", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xda130", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe7bb1817e2cca8e0707cad66c07e9cf1e160aca49e5c6f107a05b642e1a88735", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x6d8b", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0e783c12cbf5b4d354000b6a8ba043a5fecba412bc9e2bbd9ab30549d013d7c0", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x6bad", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xbe0aa7865435f15efbe859b40daeda58a9a687a50a954ecd512bfc47113efffe", + "transactionIndex": "0x1", + "blockHash": "0x8978287e1f55eadc4ed392246db52d3c3db6ca5135907dc93cde93a6c8d18b7c", + "blockNumber": "0x20d64c4", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1a4f55", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x8cc8507530779188dc7adff2a45384cd907cf51c719197742a7b91eca6320957", + "transactionIndex": "0x1", + "blockHash": "0x66f292140c0fbc7a525ddb0dcea944630f28c04f94cf9c377318faabe562d663", + "blockNumber": "0x20d64c7", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa585b", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x66f292140c0fbc7a525ddb0dcea944630f28c04f94cf9c377318faabe562d663", + "blockNumber": "0x20d64c7", + "transactionHash": "0x8cc8507530779188dc7adff2a45384cd907cf51c719197742a7b91eca6320957", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0xe7bb1817e2cca8e0707cad66c07e9cf1e160aca49e5c6f107a05b642e1a88735", + "transactionIndex": "0x1", + "blockHash": "0x9a2bf75a01812fd05d84a9624e8925fa0e9014b5238ca7643efb67e39e5ccd93", + "blockNumber": "0x20d64c9", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xb562", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + }, + { + "transactionHash": "0x0e783c12cbf5b4d354000b6a8ba043a5fecba412bc9e2bbd9ab30549d013d7c0", + "transactionIndex": "0x1", + "blockHash": "0xe4c0793e7acf8c401d2f05c4eeb9730bac70c59cdc9c7023b3311cc9a05f9fd0", + "blockNumber": "0x20d64d4", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x14469", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe4c0793e7acf8c401d2f05c4eeb9730bac70c59cdc9c7023b3311cc9a05f9fd0", + "blockNumber": "0x20d64d4", + "transactionHash": "0x0e783c12cbf5b4d354000b6a8ba043a5fecba412bc9e2bbd9ab30549d013d7c0", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692072403, + "chain": 421613, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/421613/run-latest.json b/broadcast/DeployKernel.s.sol/421613/run-latest.json index d180505e..6cc97267 100644 --- a/broadcast/DeployKernel.s.sol/421613/run-latest.json +++ b/broadcast/DeployKernel.s.sol/421613/run-latest.json @@ -1,73 +1,73 @@ { "transactions": [ { - "hash": "0xf278fddf310414c9528e8943472cddd5c5c184899d2c723ff041eeb92087a9a9", + "hash": "0xbe0aa7865435f15efbe859b40daeda58a9a687a50a954ecd512bfc47113efffe", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x230bb7", + "gas": "0x22b045", "value": "0x0", - "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "hash": "0x8cc8507530779188dc7adff2a45384cd907cf51c719197742a7b91eca6320957", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0xd5ae0", + "gas": "0xda130", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x1", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x18984d32c69870fa6295c17667808fa383db21267de046102eceb8e5950d2bb0", + "hash": "0xe7bb1817e2cca8e0707cad66c07e9cf1e160aca49e5c6f107a05b642e1a88735", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "setImplementation(address,bool)", "arguments": [ - "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "true" ], "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x6d8b", "value": "0x0", - "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x2", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "hash": "0x0e783c12cbf5b4d354000b6a8ba043a5fecba412bc9e2bbd9ab30549d013d7c0", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "addStake(uint32)", "arguments": [ "1" @@ -75,11 +75,11 @@ "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x6bad", "value": "0x1", "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x3", + "nonce": "0x8", "accessList": [] }, "additionalContracts": [], @@ -88,60 +88,60 @@ ], "receipts": [ { - "transactionHash": "0xf278fddf310414c9528e8943472cddd5c5c184899d2c723ff041eeb92087a9a9", + "transactionHash": "0xbe0aa7865435f15efbe859b40daeda58a9a687a50a954ecd512bfc47113efffe", "transactionIndex": "0x1", - "blockHash": "0x088cff90920683955173731b8b2e8fb971cd2899f41f6ad228a4ee05c5fab1d1", - "blockNumber": "0x1feac3c", + "blockHash": "0x8978287e1f55eadc4ed392246db52d3c3db6ca5135907dc93cde93a6c8d18b7c", + "blockNumber": "0x20d64c4", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x1a94a9", - "gasUsed": "0x1a94a9", + "cumulativeGasUsed": "0x1a4f55", + "gasUsed": "0x1a4f55", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x8d6b4c6f0" + "effectiveGasPrice": "0x5f5e100" }, { - "transactionHash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "transactionHash": "0x8cc8507530779188dc7adff2a45384cd907cf51c719197742a7b91eca6320957", "transactionIndex": "0x1", - "blockHash": "0x1e5b5bd2885d86b564b3a959832b4659dbf3c1bf2af6bd0ac92717586a4808ee", - "blockNumber": "0x1feac4a", + "blockHash": "0x66f292140c0fbc7a525ddb0dcea944630f28c04f94cf9c377318faabe562d663", + "blockNumber": "0x20d64c7", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0xa230d", - "gasUsed": "0xa230d", + "cumulativeGasUsed": "0xa585b", + "gasUsed": "0xa585b", "contractAddress": null, "logs": [ { - "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" ], "data": "0x", - "blockHash": "0x1e5b5bd2885d86b564b3a959832b4659dbf3c1bf2af6bd0ac92717586a4808ee", - "blockNumber": "0x1feac4a", - "transactionHash": "0x408dfd8719fa6fbc9d02f4ec2c9704f3240b2b9f0416d854ec2b2d7c20d6add0", + "blockHash": "0x66f292140c0fbc7a525ddb0dcea944630f28c04f94cf9c377318faabe562d663", + "blockNumber": "0x20d64c7", + "transactionHash": "0x8cc8507530779188dc7adff2a45384cd907cf51c719197742a7b91eca6320957", "transactionIndex": "0x1", "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x88b417060" + "effectiveGasPrice": "0x5f5e100" }, { - "transactionHash": "0x18984d32c69870fa6295c17667808fa383db21267de046102eceb8e5950d2bb0", + "transactionHash": "0xe7bb1817e2cca8e0707cad66c07e9cf1e160aca49e5c6f107a05b642e1a88735", "transactionIndex": "0x1", - "blockHash": "0x28b742fed42b1ce7e2a33fdd5c4ea49115e282fd0d80dee2ccd2f6c0de2e4a8e", - "blockNumber": "0x1feac4d", + "blockHash": "0x9a2bf75a01812fd05d84a9624e8925fa0e9014b5238ca7643efb67e39e5ccd93", + "blockNumber": "0x20d64c9", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "cumulativeGasUsed": "0xb562", "gasUsed": "0xb562", "contractAddress": null, @@ -149,15 +149,15 @@ "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x886071730" + "effectiveGasPrice": "0x5f5e100" }, { - "transactionHash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "transactionHash": "0x0e783c12cbf5b4d354000b6a8ba043a5fecba412bc9e2bbd9ab30549d013d7c0", "transactionIndex": "0x1", - "blockHash": "0x2c7e2365eb70c09c2ad6cbffc89af0bfc9bca976d686e4efc1176dbd69f90796", - "blockNumber": "0x1feac56", + "blockHash": "0xe4c0793e7acf8c401d2f05c4eeb9730bac70c59cdc9c7023b3311cc9a05f9fd0", + "blockNumber": "0x20d64d4", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "cumulativeGasUsed": "0x14469", "gasUsed": "0x14469", "contractAddress": null, @@ -166,28 +166,28 @@ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "topics": [ "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", - "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x2c7e2365eb70c09c2ad6cbffc89af0bfc9bca976d686e4efc1176dbd69f90796", - "blockNumber": "0x1feac56", - "transactionHash": "0xecdf420dc74cb3bb1e70c771ebcc4e2adbabe71d3d757ca6830b294494143397", + "blockHash": "0xe4c0793e7acf8c401d2f05c4eeb9730bac70c59cdc9c7023b3311cc9a05f9fd0", + "blockNumber": "0x20d64d4", + "transactionHash": "0x0e783c12cbf5b4d354000b6a8ba043a5fecba412bc9e2bbd9ab30549d013d7c0", "transactionIndex": "0x1", "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x844a655d0" + "effectiveGasPrice": "0x5f5e100" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691520179, + "timestamp": 1692072403, "chain": 421613, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43113/run-1692072581.json b/broadcast/DeployKernel.s.sol/43113/run-1692072581.json new file mode 100644 index 00000000..61203e4e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43113/run-1692072581.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0x11efa6bf149e64554e222ca7c8aa98fd45313a7d8be419c37941a695306446b0", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7b26345d0745ec879181d646e7e0a4648eb255589d21163b5c1ad5e3658aba8f", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x11efa6bf149e64554e222ca7c8aa98fd45313a7d8be419c37941a695306446b0", + "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", + "0x7b26345d0745ec879181d646e7e0a4648eb255589d21163b5c1ad5e3658aba8f", + "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c" + ], + "returns": {}, + "timestamp": 1692072581, + "chain": 43113, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43113/run-1692072594.json b/broadcast/DeployKernel.s.sol/43113/run-1692072594.json new file mode 100644 index 00000000..a5376240 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43113/run-1692072594.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x11efa6bf149e64554e222ca7c8aa98fd45313a7d8be419c37941a695306446b0", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7b26345d0745ec879181d646e7e0a4648eb255589d21163b5c1ad5e3658aba8f", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x11efa6bf149e64554e222ca7c8aa98fd45313a7d8be419c37941a695306446b0", + "transactionIndex": "0x0", + "blockHash": "0xc02149fc6e41910dd401cf1ac2f6e5a489618ebea1e0cadc75935751da75fd83", + "blockNumber": "0x17d9e42", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1a4f55", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", + "transactionIndex": "0x0", + "blockHash": "0xfd6662ea4c0d75991c0c9b67a94b02ff8251297d85ae24106c2af0f39e0cfd09", + "blockNumber": "0x17d9e43", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa585b", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xfd6662ea4c0d75991c0c9b67a94b02ff8251297d85ae24106c2af0f39e0cfd09", + "blockNumber": "0x17d9e43", + "transactionHash": "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0x7b26345d0745ec879181d646e7e0a4648eb255589d21163b5c1ad5e3658aba8f", + "transactionIndex": "0x0", + "blockHash": "0xd650eb45ade71918f453221e26839fd62e6270e4dbb83c944c93738195424619", + "blockNumber": "0x17d9e45", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xb562", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c", + "transactionIndex": "0x0", + "blockHash": "0x73225212c45b88e70877cf3963bff5155723dd4bfe24f37b04d04885bda90805", + "blockNumber": "0x17d9e46", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x14469", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x73225212c45b88e70877cf3963bff5155723dd4bfe24f37b04d04885bda90805", + "blockNumber": "0x17d9e46", + "transactionHash": "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692072594, + "chain": 43113, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43113/run-latest.json b/broadcast/DeployKernel.s.sol/43113/run-latest.json index ada7a51d..a5376240 100644 --- a/broadcast/DeployKernel.s.sol/43113/run-latest.json +++ b/broadcast/DeployKernel.s.sol/43113/run-latest.json @@ -1,73 +1,73 @@ { "transactions": [ { - "hash": "0xd0b1ffa7799070e830d79d01c8b2735ccdb69ac52ab7bab244ced7493799f3ba", + "hash": "0x11efa6bf149e64554e222ca7c8aa98fd45313a7d8be419c37941a695306446b0", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x26dfd0", + "gas": "0x24572d", "value": "0x0", - "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x18bc42e511afc2bed20c0a346eb354420ef3d67a27e1e9646388f88afe9d031c", + "hash": "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0xe0068", + "gas": "0xf2137", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x1", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x6", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": null, + "hash": "0x7b26345d0745ec879181d646e7e0a4648eb255589d21163b5c1ad5e3658aba8f", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "setImplementation(address,bool)", "arguments": [ - "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "true" ], "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x10945", "value": "0x0", - "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x2", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": null, + "hash": "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "addStake(uint32)", "arguments": [ "1" @@ -75,26 +75,119 @@ "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x1da73", "value": "0x1", "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x3", + "nonce": "0x8", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false } ], - "receipts": [], - "libraries": [], - "pending": [ - "0xd0b1ffa7799070e830d79d01c8b2735ccdb69ac52ab7bab244ced7493799f3ba", - "0x18bc42e511afc2bed20c0a346eb354420ef3d67a27e1e9646388f88afe9d031c" + "receipts": [ + { + "transactionHash": "0x11efa6bf149e64554e222ca7c8aa98fd45313a7d8be419c37941a695306446b0", + "transactionIndex": "0x0", + "blockHash": "0xc02149fc6e41910dd401cf1ac2f6e5a489618ebea1e0cadc75935751da75fd83", + "blockNumber": "0x17d9e42", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1a4f55", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", + "transactionIndex": "0x0", + "blockHash": "0xfd6662ea4c0d75991c0c9b67a94b02ff8251297d85ae24106c2af0f39e0cfd09", + "blockNumber": "0x17d9e43", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xa585b", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xfd6662ea4c0d75991c0c9b67a94b02ff8251297d85ae24106c2af0f39e0cfd09", + "blockNumber": "0x17d9e43", + "transactionHash": "0xbca08b39206591f5fffcc645478f04710b177f852ec5bba99e7c04331cf46afd", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0x7b26345d0745ec879181d646e7e0a4648eb255589d21163b5c1ad5e3658aba8f", + "transactionIndex": "0x0", + "blockHash": "0xd650eb45ade71918f453221e26839fd62e6270e4dbb83c944c93738195424619", + "blockNumber": "0x17d9e45", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xb562", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c", + "transactionIndex": "0x0", + "blockHash": "0x73225212c45b88e70877cf3963bff5155723dd4bfe24f37b04d04885bda90805", + "blockNumber": "0x17d9e46", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x14469", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x73225212c45b88e70877cf3963bff5155723dd4bfe24f37b04d04885bda90805", + "blockNumber": "0x17d9e46", + "transactionHash": "0xe9bf21a02bbbeeab86ff46b72c63b0380efe292c655a0fd5e152794a32bcd36c", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } ], + "libraries": [], + "pending": [], "returns": {}, - "timestamp": 1691520581, + "timestamp": 1692072594, "chain": 43113, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43114/run-1692129024.json b/broadcast/DeployKernel.s.sol/43114/run-1692129024.json new file mode 100644 index 00000000..111cb4e2 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43114/run-1692129024.json @@ -0,0 +1,79 @@ +{ + "transactions": [ + { + "hash": "0xf7658b9b8dc4ae3c724431516ca8299fbf6bda35ad6a6996ec199614afcab9ae", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdabf6b162679564cd5489dce9bdb0434cccdf37d8bbda75205753e351d3229e6", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xf7658b9b8dc4ae3c724431516ca8299fbf6bda35ad6a6996ec199614afcab9ae", + "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "0xdabf6b162679564cd5489dce9bdb0434cccdf37d8bbda75205753e351d3229e6" + ], + "returns": {}, + "timestamp": 1692129024, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43114/run-1692129038.json b/broadcast/DeployKernel.s.sol/43114/run-1692129038.json new file mode 100644 index 00000000..57c3bc8a --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43114/run-1692129038.json @@ -0,0 +1,140 @@ +{ + "transactions": [ + { + "hash": "0xf7658b9b8dc4ae3c724431516ca8299fbf6bda35ad6a6996ec199614afcab9ae", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdabf6b162679564cd5489dce9bdb0434cccdf37d8bbda75205753e351d3229e6", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf7658b9b8dc4ae3c724431516ca8299fbf6bda35ad6a6996ec199614afcab9ae", + "transactionIndex": "0x1", + "blockHash": "0x13acb2bc78167a2a64f061812499b2b151999c61461b2072611430c078fd4a79", + "blockNumber": "0x206423b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1aa15d", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "transactionIndex": "0x5", + "blockHash": "0xcee8337b773793c88942038cfa5b7bfe1fc979a2c40230f03d07eaa1c017daa2", + "blockNumber": "0x206423c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x189b26", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xcee8337b773793c88942038cfa5b7bfe1fc979a2c40230f03d07eaa1c017daa2", + "blockNumber": "0x206423c", + "transactionHash": "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "transactionIndex": "0x5", + "logIndex": "0xe", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0xdabf6b162679564cd5489dce9bdb0434cccdf37d8bbda75205753e351d3229e6", + "transactionIndex": "0x3", + "blockHash": "0x4eb847192d3b84f36729376758a447071bb6ed6d59c3f1bcb587a2b83209a2b1", + "blockNumber": "0x206423d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x5e800", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129038, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/43114/run-latest.json b/broadcast/DeployKernel.s.sol/43114/run-latest.json new file mode 100644 index 00000000..57c3bc8a --- /dev/null +++ b/broadcast/DeployKernel.s.sol/43114/run-latest.json @@ -0,0 +1,140 @@ +{ + "transactions": [ + { + "hash": "0xf7658b9b8dc4ae3c724431516ca8299fbf6bda35ad6a6996ec199614afcab9ae", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x2", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x3", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdabf6b162679564cd5489dce9bdb0434cccdf37d8bbda75205753e351d3229e6", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf7658b9b8dc4ae3c724431516ca8299fbf6bda35ad6a6996ec199614afcab9ae", + "transactionIndex": "0x1", + "blockHash": "0x13acb2bc78167a2a64f061812499b2b151999c61461b2072611430c078fd4a79", + "blockNumber": "0x206423b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1aa15d", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "transactionIndex": "0x5", + "blockHash": "0xcee8337b773793c88942038cfa5b7bfe1fc979a2c40230f03d07eaa1c017daa2", + "blockNumber": "0x206423c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x189b26", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xcee8337b773793c88942038cfa5b7bfe1fc979a2c40230f03d07eaa1c017daa2", + "blockNumber": "0x206423c", + "transactionHash": "0x3effbac54a2a6b67f619b4e3789bbf71cc621d382a6a71952f80268cffee4289", + "transactionIndex": "0x5", + "logIndex": "0xe", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + }, + { + "transactionHash": "0xdabf6b162679564cd5489dce9bdb0434cccdf37d8bbda75205753e351d3229e6", + "transactionIndex": "0x3", + "blockHash": "0x4eb847192d3b84f36729376758a447071bb6ed6d59c3f1bcb587a2b83209a2b1", + "blockNumber": "0x206423d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x5e800", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129038, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-1692071131.json b/broadcast/DeployKernel.s.sol/5/run-1692071131.json new file mode 100644 index 00000000..06ffe136 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1692071131.json @@ -0,0 +1,98 @@ +{ + "transactions": [ + { + "hash": "0xf029079ad36d6030597258f8b6378447eac6a5f6e1a34e51ad35babf3cae9965", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x47" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x48" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5b4d16418fb3e35676ef550e24c950ca759faaf7a6f77d49e44dae779d82bdf7", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x49" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xf029079ad36d6030597258f8b6378447eac6a5f6e1a34e51ad35babf3cae9965", + "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", + "0x5b4d16418fb3e35676ef550e24c950ca759faaf7a6f77d49e44dae779d82bdf7", + "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4" + ], + "returns": {}, + "timestamp": 1692071131, + "chain": 5, + "multi": false, + "commit": "e74c511" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-1692071144.json b/broadcast/DeployKernel.s.sol/5/run-1692071144.json new file mode 100644 index 00000000..6c94043f --- /dev/null +++ b/broadcast/DeployKernel.s.sol/5/run-1692071144.json @@ -0,0 +1,189 @@ +{ + "transactions": [ + { + "hash": "0xf029079ad36d6030597258f8b6378447eac6a5f6e1a34e51ad35babf3cae9965", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x47" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x48" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5b4d16418fb3e35676ef550e24c950ca759faaf7a6f77d49e44dae779d82bdf7", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x49" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x4a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf029079ad36d6030597258f8b6378447eac6a5f6e1a34e51ad35babf3cae9965", + "transactionIndex": "0x27", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x77ad9a", + "gasUsed": "0x1a5151", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e109" + }, + { + "transactionHash": "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", + "transactionIndex": "0x28", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x8206ad", + "gasUsed": "0xa5913", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "transactionHash": "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", + "transactionIndex": "0x28", + "logIndex": "0x74", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e109" + }, + { + "transactionHash": "0x5b4d16418fb3e35676ef550e24c950ca759faaf7a6f77d49e44dae779d82bdf7", + "transactionIndex": "0x29", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x82bc0f", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e109" + }, + { + "transactionHash": "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4", + "transactionIndex": "0x2a", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x840078", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "transactionHash": "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4", + "transactionIndex": "0x2a", + "logIndex": "0x75", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e109" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692071144, + "chain": 5, + "multi": false, + "commit": "e74c511" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/5/run-latest.json b/broadcast/DeployKernel.s.sol/5/run-latest.json index aeebb0f2..6c94043f 100644 --- a/broadcast/DeployKernel.s.sol/5/run-latest.json +++ b/broadcast/DeployKernel.s.sol/5/run-latest.json @@ -1,70 +1,70 @@ { "transactions": [ { - "hash": "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", + "hash": "0xf029079ad36d6030597258f8b6378447eac6a5f6e1a34e51ad35babf3cae9965", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x26dfd0", + "gas": "0x24572d", "value": "0x0", - "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x41" + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x47" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", + "hash": "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0xe0068", + "gas": "0xf2137", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x42" + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x48" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", + "hash": "0x5b4d16418fb3e35676ef550e24c950ca759faaf7a6f77d49e44dae779d82bdf7", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "setImplementation(address,bool)", "arguments": [ - "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "true" ], "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x10945", "value": "0x0", - "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x43" + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x49" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", + "hash": "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "addStake(uint32)", "arguments": [ "1" @@ -72,11 +72,11 @@ "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x1da73", "value": "0x1", "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x44" + "nonce": "0x4a" }, "additionalContracts": [], "isFixedGasLimit": false @@ -84,77 +84,77 @@ ], "receipts": [ { - "transactionHash": "0x35c14df2e10b2a8f063c12b703a7b8e2adc0297a63b32ea47ee79c3666e470dd", - "transactionIndex": "0x1b", - "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", - "blockNumber": "0x90b80f", + "transactionHash": "0xf029079ad36d6030597258f8b6378447eac6a5f6e1a34e51ad35babf3cae9965", + "transactionIndex": "0x27", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x4fdc8a", - "gasUsed": "0x1a96ab", + "cumulativeGasUsed": "0x77ad9a", + "gasUsed": "0x1a5151", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x0", - "effectiveGasPrice": "0x57779217" + "effectiveGasPrice": "0x5f5e109" }, { - "transactionHash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", - "transactionIndex": "0x1c", - "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", - "blockNumber": "0x90b80f", + "transactionHash": "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", + "transactionIndex": "0x28", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x5a004b", - "gasUsed": "0xa23c1", + "cumulativeGasUsed": "0x8206ad", + "gasUsed": "0xa5913", "contractAddress": null, "logs": [ { - "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" ], "data": "0x", - "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", - "blockNumber": "0x90b80f", - "transactionHash": "0xf095a0ba95cd5ac8c588ee5663099e82b2d1703cf501ed19b066f11014038600", - "transactionIndex": "0x1c", - "logIndex": "0x3e", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "transactionHash": "0xa4432e7d2799d7fdf593806cdb1e6fd988f03b6438a4e6bad2271f6072481cc6", + "transactionIndex": "0x28", + "logIndex": "0x74", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x0", - "effectiveGasPrice": "0x57779217" + "effectiveGasPrice": "0x5f5e109" }, { - "transactionHash": "0x60651214dd6bb8a6ab4208bd439f119f903fd15c8a023bdd8e2435f119f7900c", - "transactionIndex": "0x1d", - "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", - "blockNumber": "0x90b80f", + "transactionHash": "0x5b4d16418fb3e35676ef550e24c950ca759faaf7a6f77d49e44dae779d82bdf7", + "transactionIndex": "0x29", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x5ab5ad", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x82bc0f", "gasUsed": "0xb562", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x0", - "effectiveGasPrice": "0x57779217" + "effectiveGasPrice": "0x5f5e109" }, { - "transactionHash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", - "transactionIndex": "0x1e", - "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", - "blockNumber": "0x90b80f", + "transactionHash": "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4", + "transactionIndex": "0x2a", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x5bfa16", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x840078", "gasUsed": "0x14469", "contractAddress": null, "logs": [ @@ -162,28 +162,28 @@ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "topics": [ "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", - "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0xc33eb9db0e935f0e2bf49c6868db608aef75f1016c3ee434074d509aa49b7c1e", - "blockNumber": "0x90b80f", - "transactionHash": "0xf13bbbb94c48831db2c5b72ab70b0cfd537241a80a0a007bafa8947e29c3b65b", - "transactionIndex": "0x1e", - "logIndex": "0x3f", + "blockHash": "0x101841c156c132480d785158404e4e54f03446c779ed81db95d6d397177dba0c", + "blockNumber": "0x91439c", + "transactionHash": "0xa02e036bc66d1090a939fa7f4f023abcdf97c47aa0dd8bb1a36b28f7d6bb53f4", + "transactionIndex": "0x2a", + "logIndex": "0x75", "removed": false } ], "status": "0x1", - "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", "type": "0x0", - "effectiveGasPrice": "0x57779217" + "effectiveGasPrice": "0x5f5e109" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691517818, + "timestamp": 1692071144, "chain": 5, "multi": false, - "commit": "06a62a2" + "commit": "e74c511" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1692029918.json b/broadcast/DeployKernel.s.sol/80001/run-1692029918.json new file mode 100644 index 00000000..8758358f --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1692029918.json @@ -0,0 +1,98 @@ +{ + "transactions": [ + { + "hash": "0x87a42150aaceaf8bf0ccad99ff844ea18a9f73f901d71828f529ba50ac375621", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9f231b30b29951938a4f57f72229708b59731dea1416050c26c28e20464b2353", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xec619", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b9938819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610acb90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630396cb60146101475780632569296214610142578063296601cd1461013d5780634d6cb700146101385780635414dff01461013357806354d1f13d1461012e578063584465f2146101295780636544c82814610124578063715018a61461011f5780638da5cb5b1461011a578063b0d691fe14610115578063bb30a97414610110578063bb9fe6bf1461010b578063c23a5cea14610106578063d7533f0214610101578063db4c545e146100fc578063f04e283e146100f7578063f2fde38b146100f25763fee81cf4146100ed57600080fd5b610777565b610737565b6106e1565b6106b8565b61069a565b61062b565b6105d5565b61057b565b610552565b610525565b6104de565b61049c565b610455565b61040e565b6103f0565b61036c565b610254565b6101c4565b600060203660031901126101c15760043563ffffffff81168091036101bd5761016e6107e7565b81546001600160a01b0316908290823b156101bd57602460405180948193621cb65b60e51b8352600483015234905af180156101b8576101ac575080f35b6101b59061097c565b80f35b610abf565b5080fd5b80fd5b6000806003193601126101c15763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b6001600160a01b0381160361022157565b600080fd5b9181601f840112156102215782359167ffffffffffffffff8311610221576020838186019501011161022157565b60603660031901126102215760043561026c81610210565b60243567ffffffffffffffff81116102215761028c903690600401610226565b6001600160a01b03831660009081526001602052604090205491929160ff161561031557610311926102f7926bffffffffffffffffffffffff60405160208101906102ed816102df60443589898761096c565b03601f1981018352826109a6565b51902016906109c8565b6040516001600160a01b0390911681529081906020820190565b0390f35b60405162461bcd60e51b815260206004820152602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b346102215760403660031901126102215760043567ffffffffffffffff8111610221576103de6bffffffffffffffffffffffff6103af6020933690600401610226565b6103d56040805183819489830196873781016024358982015203878101845201826109a6565b51902016610804565b6040516001600160a01b039091168152f35b346102215760203660031901126102215760206103de600435610804565b6000806003193601126101c15763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b346102215760203660031901126102215760043561047281610210565b61047a6107e7565b600080546001600160a01b0319166001600160a01b0392909216919091179055005b34610221576020366003190112610221576004356104b981610210565b60018060a01b03166000526001602052602060ff604060002054166040519015158152f35b6000806003193601126101c1576104f36107e7565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b3461022157600036600319011261022157638b78c6d819546040516001600160a01b039091168152602090f35b34610221576000366003190112610221576000546040516001600160a01b039091168152602090f35b346102215760403660031901126102215760043561059881610210565b60243590811515809203610221576105ae6107e7565b60018060a01b0316600052600160205260406000209060ff80198354169116179055600080f35b34610221576000806003193601126101c1576105ef6107e7565b805481906001600160a01b0316803b1561062857819060046040518094819363bb9fe6bf60e01b83525af180156101b8576101ac575080f35b50fd5b3461022157600060203660031901126101c15760043561064a81610210565b6106526107e7565b81546001600160a01b0390811691839190833b156106965760249083604051958694859363611d2e7560e11b85521660048401525af180156101b8576101ac575080f35b8280fd5b346102215760003660031901126102215760206040516202a3008152f35b34610221576000366003190112610221576020608960136106d7610831565b0120604051908152f35b6020366003190112610221576004356106f981610210565b6107016107e7565b63389a75e1600c52806000526020600c20908154421161072957600061072792556107ae565b005b636f5e88186000526004601cfd5b60203660031901126102215760043561074f81610210565b6107576107e7565b8060601b1561076957610727906107ae565b637448fbae6000526004601cfd5b346102215760203660031901126102215760043561079481610210565b63389a75e1600c52600052602080600c2054604051908152f35b60018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b638b78c6d8195433036107f657565b6382b429006000526004601cfd5b60896013610810610831565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c156108d557666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b8260209493928237019081520190565b67ffffffffffffffff811161099057604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761099057604052565b9291908060601c803314901517156109e6576109e3936109f4565b90565b632f6348366000526004601cfd5b91909392610a00610831565b906000928660896013850186f5966001600160a01b03881615610aa25750918184939284938784527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc602085015260408401376040019034885af115610a87577f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818592a3565b3d15610a95573d81803e3d90fd5b633011642590526004601cfd5b93959650505050610ab39150610804565b90813b15610a95575090565b6040513d6000823e3d90fd0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe6" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc9e8838ca4e0a64b6aa9ff6c29c39353f5c8cf5975131b0d43c012fcdefa7349", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xa3a415a987b1ae1afe28ab77f9e9cb1d1dbb4d69", + "gas": "0xfa7a", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xa3a415a987b1ae1afe28ab77f9e9cb1d1dbb4d69", + "gas": "0x1bfef", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe8" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x87a42150aaceaf8bf0ccad99ff844ea18a9f73f901d71828f529ba50ac375621", + "0x9f231b30b29951938a4f57f72229708b59731dea1416050c26c28e20464b2353", + "0xc9e8838ca4e0a64b6aa9ff6c29c39353f5c8cf5975131b0d43c012fcdefa7349", + "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce" + ], + "returns": {}, + "timestamp": 1692029918, + "chain": 80001, + "multi": false, + "commit": "fde9e99" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1692029925.json b/broadcast/DeployKernel.s.sol/80001/run-1692029925.json new file mode 100644 index 00000000..17aa7705 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1692029925.json @@ -0,0 +1,287 @@ +{ + "transactions": [ + { + "hash": "0x87a42150aaceaf8bf0ccad99ff844ea18a9f73f901d71828f529ba50ac375621", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9f231b30b29951938a4f57f72229708b59731dea1416050c26c28e20464b2353", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xec619", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b9938819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610acb90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630396cb60146101475780632569296214610142578063296601cd1461013d5780634d6cb700146101385780635414dff01461013357806354d1f13d1461012e578063584465f2146101295780636544c82814610124578063715018a61461011f5780638da5cb5b1461011a578063b0d691fe14610115578063bb30a97414610110578063bb9fe6bf1461010b578063c23a5cea14610106578063d7533f0214610101578063db4c545e146100fc578063f04e283e146100f7578063f2fde38b146100f25763fee81cf4146100ed57600080fd5b610777565b610737565b6106e1565b6106b8565b61069a565b61062b565b6105d5565b61057b565b610552565b610525565b6104de565b61049c565b610455565b61040e565b6103f0565b61036c565b610254565b6101c4565b600060203660031901126101c15760043563ffffffff81168091036101bd5761016e6107e7565b81546001600160a01b0316908290823b156101bd57602460405180948193621cb65b60e51b8352600483015234905af180156101b8576101ac575080f35b6101b59061097c565b80f35b610abf565b5080fd5b80fd5b6000806003193601126101c15763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b6001600160a01b0381160361022157565b600080fd5b9181601f840112156102215782359167ffffffffffffffff8311610221576020838186019501011161022157565b60603660031901126102215760043561026c81610210565b60243567ffffffffffffffff81116102215761028c903690600401610226565b6001600160a01b03831660009081526001602052604090205491929160ff161561031557610311926102f7926bffffffffffffffffffffffff60405160208101906102ed816102df60443589898761096c565b03601f1981018352826109a6565b51902016906109c8565b6040516001600160a01b0390911681529081906020820190565b0390f35b60405162461bcd60e51b815260206004820152602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b346102215760403660031901126102215760043567ffffffffffffffff8111610221576103de6bffffffffffffffffffffffff6103af6020933690600401610226565b6103d56040805183819489830196873781016024358982015203878101845201826109a6565b51902016610804565b6040516001600160a01b039091168152f35b346102215760203660031901126102215760206103de600435610804565b6000806003193601126101c15763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b346102215760203660031901126102215760043561047281610210565b61047a6107e7565b600080546001600160a01b0319166001600160a01b0392909216919091179055005b34610221576020366003190112610221576004356104b981610210565b60018060a01b03166000526001602052602060ff604060002054166040519015158152f35b6000806003193601126101c1576104f36107e7565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b3461022157600036600319011261022157638b78c6d819546040516001600160a01b039091168152602090f35b34610221576000366003190112610221576000546040516001600160a01b039091168152602090f35b346102215760403660031901126102215760043561059881610210565b60243590811515809203610221576105ae6107e7565b60018060a01b0316600052600160205260406000209060ff80198354169116179055600080f35b34610221576000806003193601126101c1576105ef6107e7565b805481906001600160a01b0316803b1561062857819060046040518094819363bb9fe6bf60e01b83525af180156101b8576101ac575080f35b50fd5b3461022157600060203660031901126101c15760043561064a81610210565b6106526107e7565b81546001600160a01b0390811691839190833b156106965760249083604051958694859363611d2e7560e11b85521660048401525af180156101b8576101ac575080f35b8280fd5b346102215760003660031901126102215760206040516202a3008152f35b34610221576000366003190112610221576020608960136106d7610831565b0120604051908152f35b6020366003190112610221576004356106f981610210565b6107016107e7565b63389a75e1600c52806000526020600c20908154421161072957600061072792556107ae565b005b636f5e88186000526004601cfd5b60203660031901126102215760043561074f81610210565b6107576107e7565b8060601b1561076957610727906107ae565b637448fbae6000526004601cfd5b346102215760203660031901126102215760043561079481610210565b63389a75e1600c52600052602080600c2054604051908152f35b60018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b638b78c6d8195433036107f657565b6382b429006000526004601cfd5b60896013610810610831565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c156108d557666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b8260209493928237019081520190565b67ffffffffffffffff811161099057604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761099057604052565b9291908060601c803314901517156109e6576109e3936109f4565b90565b632f6348366000526004601cfd5b91909392610a00610831565b906000928660896013850186f5966001600160a01b03881615610aa25750918184939284938784527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc602085015260408401376040019034885af115610a87577f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818592a3565b3d15610a95573d81803e3d90fd5b633011642590526004601cfd5b93959650505050610ab39150610804565b90813b15610a95575090565b6040513d6000823e3d90fd0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xe6" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc9e8838ca4e0a64b6aa9ff6c29c39353f5c8cf5975131b0d43c012fcdefa7349", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xa3a415a987b1ae1afe28ab77f9e9cb1d1dbb4d69", + "gas": "0xfa7a", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xa3a415a987b1ae1afe28ab77f9e9cb1d1dbb4d69", + "gas": "0x1bfef", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xe8" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x87a42150aaceaf8bf0ccad99ff844ea18a9f73f901d71828f529ba50ac375621", + "transactionIndex": "0x2", + "blockHash": "0x18fe5c42b002a10e363d2fd8c4385fa628a16b4d44b67da483ae531bf22594c5", + "blockNumber": "0x252f5ab", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1fdf0a", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x000000000000000000000000000000000000000000000000000930499cb676fe00000000000000000000000000000000000000000000000014530546157198cd00000000000000000000000000000000000000000000128800663422376447df0000000000000000000000000000000000000000000000001449d4fc78bb21cf000000000000000000000000000000000000000000001288006f646bd41abedd", + "blockHash": "0x18fe5c42b002a10e363d2fd8c4385fa628a16b4d44b67da483ae531bf22594c5", + "blockNumber": "0x252f5ab", + "transactionHash": "0x87a42150aaceaf8bf0ccad99ff844ea18a9f73f901d71828f529ba50ac375621", + "transactionIndex": "0x2", + "logIndex": "0xb", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f16" + }, + { + "transactionHash": "0x9f231b30b29951938a4f57f72229708b59731dea1416050c26c28e20464b2353", + "transactionIndex": "0x1", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xc1fbb", + "gasUsed": "0xab22d", + "contractAddress": null, + "logs": [ + { + "address": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "transactionHash": "0x9f231b30b29951938a4f57f72229708b59731dea1416050c26c28e20464b2353", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x0000000000000000000000000000000000000000000000000003bc4bfe3e700e0000000000000000000000000000000000000000000000001449d4fc77162c7f0000000000000000000000000000000000000000000012880070a51b54c6f429000000000000000000000000000000000000000000000000144618b078d7bc710000000000000000000000000000000000000000000012880074616753056437", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "transactionHash": "0x9f231b30b29951938a4f57f72229708b59731dea1416050c26c28e20464b2353", + "transactionIndex": "0x1", + "logIndex": "0x4", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000100000000000000000800000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800001000000000000040100000000000200000000020000000000000000000800000000000000000080000000000000400000000000000000000000000000000000000000000000000000080000000000201000010000000000000000000000002000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000020000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f16" + }, + { + "transactionHash": "0xc9e8838ca4e0a64b6aa9ff6c29c39353f5c8cf5975131b0d43c012fcdefa7349", + "transactionIndex": "0x2", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "cumulativeGasUsed": "0xcd513", + "gasUsed": "0xb558", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000003f55650f6810000000000000000000000000000000000000000000000000144618b0782c99a100000000000000000000000000000000000000000000128800746167530564370000000000000000000000000000000000000000000000001445d95b131d31910000000000000000000000000000000000000000000012880074a0bcb814cc47", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "transactionHash": "0xc9e8838ca4e0a64b6aa9ff6c29c39353f5c8cf5975131b0d43c012fcdefa7349", + "transactionIndex": "0x2", + "logIndex": "0x5", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f16" + }, + { + "transactionHash": "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce", + "transactionIndex": "0x3", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0xA3A415a987b1Ae1afe28Ab77F9e9CB1D1DBb4D69", + "cumulativeGasUsed": "0xe1960", + "gasUsed": "0x1444d", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000a3a415a987b1ae1afe28ab77f9e9cb1d1dbb4d69" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000014453ceab0967c87000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014453ceab0967c860000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "transactionHash": "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce", + "transactionIndex": "0x3", + "logIndex": "0x6", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a3a415a987b1ae1afe28ab77f9e9cb1d1dbb4d69", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000091f1f26d0626bc04cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091f1f26d0626bc04cc", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "transactionHash": "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce", + "transactionIndex": "0x3", + "logIndex": "0x7", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x000000000000000000000000a3a415a987b1ae1afe28ab77f9e9cb1d1dbb4d69" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "transactionHash": "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce", + "transactionIndex": "0x3", + "logIndex": "0x8", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000007142bfd9bcce0000000000000000000000000000000000000000000000001445d95b1311dc110000000000000000000000000000000000000000000012880074a0bcb814cc470000000000000000000000000000000000000000000000001445681853381f43000000000000000000000000000000000000000000001288007511ff77ee8915", + "blockHash": "0x7e12662735d00adab9ce6e4b67a9b1bada0e5376dcc8de9a0f29d06581fa96a0", + "blockNumber": "0x252f5ac", + "transactionHash": "0x8ed57535ec9d22c3581713530518e7d4bf908214afe9e31017b46dfc592495ce", + "transactionIndex": "0x3", + "logIndex": "0x9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000800000000000000000000200100000000000108000002000000000000000000000000000000000000000000000000000800000000000001000040100000000000200000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000800000000000000000000080000000000201000000000000000000000000000000000000000000000000042000000004000000000000000000001000000000000000040000000800000108000000000000100000000000000000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f16" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692029925, + "chain": 80001, + "multi": false, + "commit": "fde9e99" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1692067755.json b/broadcast/DeployKernel.s.sol/80001/run-1692067755.json new file mode 100644 index 00000000..90a171d7 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1692067755.json @@ -0,0 +1,78 @@ +{ + "transactions": [ + { + "hash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xea" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xeb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xec" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843" + ], + "returns": {}, + "timestamp": 1692067755, + "chain": 80001, + "multi": false, + "commit": "1382d0c" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1692067761.json b/broadcast/DeployKernel.s.sol/80001/run-1692067761.json new file mode 100644 index 00000000..bd54b41d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1692067761.json @@ -0,0 +1,235 @@ +{ + "transactions": [ + { + "hash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xea" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xeb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xec" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xdc8f9", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "logIndex": "0xc", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x00000000000000000000000000000000000000000000000000039ced6e30b50000000000000000000000000000000000000000000000000014405c003a883ac2000000000000000000000000000000000000000000000018dd272bffa3e33ffe000000000000000000000000000000000000000000000000143cbf12cc5785c2000000000000000000000000000000000000000000000018dd2ac8ed1213f4fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "logIndex": "0xd", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000200000000020000000000000000000800000000000000000080000000000000400000000000000000000000000080000000000000000000000000080000000000201000100000000000000000000000000000000000000000000000000000004000000000000000000001400000000000000000000000000000100000000020000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + }, + { + "transactionHash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionIndex": "0x4", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xe7e5b", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x00000000000000000000000000000000000000000000000000003f58e31cfe00000000000000000000000000000000000000000000000000143cbf12cbbc586d000000000000000000000000000000000000000000000018dd2ac8ed1213f4fe000000000000000000000000000000000000000000000000143c7fb9e89f5a6d000000000000000000000000000000000000000000000018dd2b0845f530f2fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionIndex": "0x4", + "logIndex": "0xe", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + }, + { + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xfc2c4", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000143bda06d7a5cff20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143bda06d7a5cff10000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0xf", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000091e737cda26879304f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091e737cda268793050", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x10", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x11", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x0000000000000000000000000000000000000000000000000000714c87374700000000000000000000000000000000000000000000000000143c7fb9e894b9af000000000000000000000000000000000000000000000018dd2b0845f530f2fe000000000000000000000000000000000000000000000000143c0e6d615d72af000000000000000000000000000000000000000000000018dd2b79927c6839fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x12", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000820000000000000002000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000600000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000002000000004000000000000000000001000000000000000040000000800000108000000000000100000000000080000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692067761, + "chain": 80001, + "multi": false, + "commit": "1382d0c" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1692067762.json b/broadcast/DeployKernel.s.sol/80001/run-1692067762.json new file mode 100644 index 00000000..963a94fb --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1692067762.json @@ -0,0 +1,235 @@ +{ + "transactions": [ + { + "hash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xea" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xeb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xec" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xdc8f9", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "logIndex": "0xc", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x00000000000000000000000000000000000000000000000000039ced6e30b50000000000000000000000000000000000000000000000000014405c003a883ac2000000000000000000000000000000000000000000000018dd272bffa3e33ffe000000000000000000000000000000000000000000000000143cbf12cc5785c2000000000000000000000000000000000000000000000018dd2ac8ed1213f4fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "logIndex": "0xd", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000200000000020000000000000000000800000000000000000080000000000000400000000000000000000000000080000000000000000000000000080000000000201000100000000000000000000000000000000000000000000000000000004000000000000000000001400000000000000000000000000000100000000020000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + }, + { + "transactionHash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionIndex": "0x4", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xe7e5b", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x00000000000000000000000000000000000000000000000000003f58e31cfe00000000000000000000000000000000000000000000000000143cbf12cbbc586d000000000000000000000000000000000000000000000018dd2ac8ed1213f4fe000000000000000000000000000000000000000000000000143c7fb9e89f5a6d000000000000000000000000000000000000000000000018dd2b0845f530f2fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionIndex": "0x4", + "logIndex": "0xe", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + }, + { + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xfc2c4", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000143bda06d7a5cff20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143bda06d7a5cff10000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0xf", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000091e737cda26879304f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091e737cda268793050", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x10", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x11", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x0000000000000000000000000000000000000000000000000000714c87374700000000000000000000000000000000000000000000000000143c7fb9e894b9af000000000000000000000000000000000000000000000018dd2b0845f530f2fe000000000000000000000000000000000000000000000000143c0e6d615d72af000000000000000000000000000000000000000000000018dd2b79927c6839fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x12", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000820000000000000002000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000600000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000002000000004000000000000000000001000000000000000040000000800000108000000000000100000000000080000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692067762, + "chain": 80001, + "multi": false, + "commit": "1382d0c" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json index 15610317..963a94fb 100644 --- a/broadcast/DeployKernel.s.sol/80001/run-latest.json +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -1,20 +1,63 @@ { "transactions": [ { - "hash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "hash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xea" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x10945", "value": "0x0", - "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0xe4" + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xeb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xec" }, "additionalContracts": [], "isFixedGasLimit": false @@ -22,13 +65,61 @@ ], "receipts": [ { - "transactionHash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", - "transactionIndex": "0x1d", - "blockHash": "0x25de694995c671749e9005775d6fe88e01f3b6e6da92360b28131e4fd259af66", - "blockNumber": "0x24fc0ed", + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x46d41e", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xdc8f9", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "logIndex": "0xc", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x00000000000000000000000000000000000000000000000000039ced6e30b50000000000000000000000000000000000000000000000000014405c003a883ac2000000000000000000000000000000000000000000000018dd272bffa3e33ffe000000000000000000000000000000000000000000000000143cbf12cc5785c2000000000000000000000000000000000000000000000018dd2ac8ed1213f4fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0x0851c13b961617f7b1d221cc342e5077419c03b0094ff123965ee2e2bd529506", + "transactionIndex": "0x3", + "logIndex": "0xd", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000200000000020000000000000000000800000000000000000080000000000000400000000000000000000000000080000000000000000000000000080000000000201000100000000000000000000000000000000000000000000000000000004000000000000000000001400000000000000000000000000000100000000020000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + }, + { + "transactionHash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionIndex": "0x4", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xe7e5b", "gasUsed": "0xb562", "contractAddress": null, "logs": [ @@ -38,28 +129,107 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x00000000000000000000000000000000000000000000000000003f58e31cfe00000000000000000000000000000000000000000000000000143cbf12cbbc586d000000000000000000000000000000000000000000000018dd2ac8ed1213f4fe000000000000000000000000000000000000000000000000143c7fb9e89f5a6d000000000000000000000000000000000000000000000018dd2b0845f530f2fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xddaeff7b732e00a1922657fd8c9486f1aae36924bae965399b8d405179009da5", + "transactionIndex": "0x4", + "logIndex": "0xe", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + }, + { + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xfc2c4", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000143bda06d7a5cff20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143bda06d7a5cff10000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0xf", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000091e737cda26879304f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091e737cda268793050", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x10", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x11", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" ], - "data": "0x00000000000000000000000000000000000000000000000000003f58e31cfe000000000000000000000000000000000000000000000000001453449ef89aa24f00000000000000000000000000000000000000000000104e05fb33993489c61000000000000000000000000000000000000000000000000014530546157da44f00000000000000000000000000000000000000000000104e05fb72f217a6c410", - "blockHash": "0x25de694995c671749e9005775d6fe88e01f3b6e6da92360b28131e4fd259af66", - "blockNumber": "0x24fc0ed", - "transactionHash": "0x7c9dc5bc0bea4f4cab67f3b97734dcfef29e3be3e3d81cd9dd63193098bbecfe", - "transactionIndex": "0x1d", - "logIndex": "0xaa", + "data": "0x0000000000000000000000000000000000000000000000000000714c87374700000000000000000000000000000000000000000000000000143c7fb9e894b9af000000000000000000000000000000000000000000000018dd2b0845f530f2fe000000000000000000000000000000000000000000000000143c0e6d615d72af000000000000000000000000000000000000000000000018dd2b79927c6839fe", + "blockHash": "0xc73223146cb1ad21c39bcb56f4b4379100772771e65cac4a291c60c3239df20d", + "blockNumber": "0x253326b", + "transactionHash": "0xcc30f64ef12ecb53b53291feaef7d569de3ecb267f1f0cc5963bf78d8f16a843", + "transactionIndex": "0x5", + "logIndex": "0x12", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000820000000000000002000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000600000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000002000000004000000000000000000001000000000000000040000000800000108000000000000100000000000080000000000000000000000200000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0x59682f11" + "effectiveGasPrice": "0x59682f0f" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691517545, + "timestamp": 1692067762, "chain": 80001, "multi": false, - "commit": "06a62a2" + "commit": "1382d0c" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/8453/run-1692129323.json b/broadcast/DeployKernel.s.sol/8453/run-1692129323.json new file mode 100644 index 00000000..44dc8bd6 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/8453/run-1692129323.json @@ -0,0 +1,79 @@ +{ + "transactions": [ + { + "hash": "0xb8a25d22b4fcd96aa1aeaffa492edff94045844b97a8ac8e23f4d24d832e66b1", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe92aea50660f7ba4a027ccaf0aadd3babf24c9e2dda45e35dab3278e30ea523c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xb8a25d22b4fcd96aa1aeaffa492edff94045844b97a8ac8e23f4d24d832e66b1", + "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "0xe92aea50660f7ba4a027ccaf0aadd3babf24c9e2dda45e35dab3278e30ea523c" + ], + "returns": {}, + "timestamp": 1692129323, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/8453/run-1692129331.json b/broadcast/DeployKernel.s.sol/8453/run-1692129331.json new file mode 100644 index 00000000..bfefb6b7 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/8453/run-1692129331.json @@ -0,0 +1,140 @@ +{ + "transactions": [ + { + "hash": "0xb8a25d22b4fcd96aa1aeaffa492edff94045844b97a8ac8e23f4d24d832e66b1", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe92aea50660f7ba4a027ccaf0aadd3babf24c9e2dda45e35dab3278e30ea523c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb8a25d22b4fcd96aa1aeaffa492edff94045844b97a8ac8e23f4d24d832e66b1", + "transactionIndex": "0x1", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b4962", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e35" + }, + { + "transactionHash": "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "transactionIndex": "0x2", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x25a1bd", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "transactionHash": "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e35" + }, + { + "transactionHash": "0xe92aea50660f7ba4a027ccaf0aadd3babf24c9e2dda45e35dab3278e30ea523c", + "transactionIndex": "0x3", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x26571f", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e35" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129331, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/8453/run-latest.json b/broadcast/DeployKernel.s.sol/8453/run-latest.json new file mode 100644 index 00000000..bfefb6b7 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/8453/run-latest.json @@ -0,0 +1,140 @@ +{ + "transactions": [ + { + "hash": "0xb8a25d22b4fcd96aa1aeaffa492edff94045844b97a8ac8e23f4d24d832e66b1", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x4", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x5", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe92aea50660f7ba4a027ccaf0aadd3babf24c9e2dda45e35dab3278e30ea523c", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb8a25d22b4fcd96aa1aeaffa492edff94045844b97a8ac8e23f4d24d832e66b1", + "transactionIndex": "0x1", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b4962", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e35" + }, + { + "transactionHash": "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "transactionIndex": "0x2", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x25a1bd", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "transactionHash": "0xb38f2c085f33408fb2100cf064f1d206a26e385cc9c4cc2e23e90173412e73a0", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e35" + }, + { + "transactionHash": "0xe92aea50660f7ba4a027ccaf0aadd3babf24c9e2dda45e35dab3278e30ea523c", + "transactionIndex": "0x3", + "blockHash": "0x00265039832576befa7631b00458358c0cb3e3f251b93db617105a744b384ee2", + "blockNumber": "0x28bda6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x26571f", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e35" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129331, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/84531/run-1692073995.json b/broadcast/DeployKernel.s.sol/84531/run-1692073995.json new file mode 100644 index 00000000..6a332470 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/84531/run-1692073995.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xb", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692073995, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/84531/run-1692074111.json b/broadcast/DeployKernel.s.sol/84531/run-1692074111.json new file mode 100644 index 00000000..f2b2dcbe --- /dev/null +++ b/broadcast/DeployKernel.s.sol/84531/run-1692074111.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0x621c9a10560ae46f80eb4162ce1d6d7b5999cd2834a2c042ecd90c00a710ea9d", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4d4250c8424c25122dfb19922a456aae922da996906aa64e2efb89b1bde0a6a6", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xb", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x621c9a10560ae46f80eb4162ce1d6d7b5999cd2834a2c042ecd90c00a710ea9d", + "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", + "0x4d4250c8424c25122dfb19922a456aae922da996906aa64e2efb89b1bde0a6a6", + "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223" + ], + "returns": {}, + "timestamp": 1692074111, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/84531/run-1692074119.json b/broadcast/DeployKernel.s.sol/84531/run-1692074119.json new file mode 100644 index 00000000..1324cbb9 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/84531/run-1692074119.json @@ -0,0 +1,193 @@ +{ + "transactions": [ + { + "hash": "0x621c9a10560ae46f80eb4162ce1d6d7b5999cd2834a2c042ecd90c00a710ea9d", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4d4250c8424c25122dfb19922a456aae922da996906aa64e2efb89b1bde0a6a6", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xb", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "addStake(uint32)", + "arguments": [ + "1" + ], + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da73", + "value": "0x1", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x621c9a10560ae46f80eb4162ce1d6d7b5999cd2834a2c042ecd90c00a710ea9d", + "transactionIndex": "0x1", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b145e", + "gasUsed": "0x1a4f55", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", + "transactionIndex": "0x2", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x256cb9", + "gasUsed": "0xa585b", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "transactionHash": "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x4d4250c8424c25122dfb19922a456aae922da996906aa64e2efb89b1bde0a6a6", + "transactionIndex": "0x3", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x26221b", + "gasUsed": "0xb562", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + }, + { + "transactionHash": "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223", + "transactionIndex": "0x4", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x276684", + "gasUsed": "0x14469", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "transactionHash": "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692074119, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/84531/run-latest.json b/broadcast/DeployKernel.s.sol/84531/run-latest.json index fefb29af..1324cbb9 100644 --- a/broadcast/DeployKernel.s.sol/84531/run-latest.json +++ b/broadcast/DeployKernel.s.sol/84531/run-latest.json @@ -1,73 +1,73 @@ { "transactions": [ { - "hash": "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "hash": "0x621c9a10560ae46f80eb4162ce1d6d7b5999cd2834a2c042ecd90c00a710ea9d", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x26dfd0", + "gas": "0x24572d", "value": "0x0", - "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001ff138819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611e059283620001ec8439608051836118f9015260a0518361191c015260c0518361198e015260e051836119b4015251826118d801525181818161049c0152818161065e015281816108b701528181610a4201528181610b6d01528181610d6701528181610e8801528181610f89015281816110b301526113030152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661109657005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57611004565b610f72565b610ed4565b610e55565b610dc6565b610d51565b610d1c565b610c74565b610c3d565b610b57565b610aff565b6109fb565b610932565b61086e565b610744565b61063a565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611de58339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ea565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b61046d61041a565b9360a4356001600160401b0381116101755761048d903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610630575b61061e5784926104fa610591926104eb6104dd6101ff565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105218761105e565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105bb6000998a94600484016115fb565b038183895af1801561061957610600575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060d61061392610190565b8061016a565b386105cc565b6112e3565b604051637046c88d60e01b8152600490fd5b50303314156104c5565b602036600319011261017557600435610652816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106d6575b61061e57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b5030331415610687565b9291926001600160401b0382116101a35760405191610709601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610741933591016106e0565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077b61020e565b9061078784840161030b565b8252602484013560208301526044840135818111610175576107ae90843691870101610726565b60408301526064840135818111610175576107ce90843691870101610726565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e08301526101048401356101008301526101248401358181116101755761082390843691870101610726565b610120830152610144840135908111610175576102c09361085e9361084b9236920101610726565b61014082015260443590602435906112ef565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c091600091610904575b506040519081529081906020820190565b610925915060203d811161092b575b61091d81836101de565b810190611204565b386108f3565b503d610913565b34610175576020366003190112610175576102c06109776109516103ee565b60006060604051610961816101a8565b828152826020820152826040820152015261105e565b60405190610984826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a13816102fa565b6044356001600160401b03811161017557610a32903690600401610726565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac9575b61061e5780610a8260019261110f565b03610aa85760008281939260208394519201905af43d82803e15610aa4573d90f35b3d90fd5b6000828193926020839451920190602435905af13d82803e15610aa4573d90f35b50610ad9610ad5611bad565b1590565b610a72565b60405190610aeb826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ade565b90604060031983011261017557600435610b34816102fa565b91602435906001600160401b03821161017557610b5391600401610316565b9091565b610b6036610b1b565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c33575b61061e5780600080516020611de58339815191525460501c1691610bb981611d31565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c2f578385610c0d819593829463064acaab60e11b8452600484016115fb565b03925af1801561061957610c1f575080f35b8061060d610c2c92610190565b80f35b8380fd5b5030331415610b96565b34610175576000366003190112610175576020600080516020611de58339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cca610c9061022e565b610c98610ade565b90604051928392600f60f81b8452610cbc60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d0557505050500390f35b835185528695509381019392810192600101610cf6565b34610175576000366003190112610175576020600080516020611de58339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610de26004356102fa565b610ded6024356102fa565b6001600160401b0360443581811161017557610e0d903690600401610d96565b505060643581811161017557610e27903690600401610d96565b505060843590811161017557610e41903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610619576102c09160009161090457506040519081529081906020820190565b610edd36610b1b565b600080516020611de583398151915254919290916001600160a01b03919060501c8216610f6157610f0d81611d31565b1691823b1561017557610f42926000928360405180968195829463064acaab60e11b8452602060048501526024840191611597565b03925af1801561061957610f5257005b8061060d610f5f92610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f866103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ffa575b61061e57600080516020611de583398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fb9565b346101755760a0366003190112610175576110206004356102fa565b61102b6024356102fa565b6084356001600160401b0381116101755761104a903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006110ac81356001600160e01b03191661105e565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611100575b61061e57818091368280378136915af43d82803e15610aa4573d90f35b50611109611bad565b156110e3565b6002111561111957565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111f557505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112d9906020810151608084015283810151611258610160918260a08701526101c0860190610250565b906112c6611278606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611537576004908135978861014481013501928060248501940135600080516020611de5833981519152549461136561135f838361112f565b906111d8565b9b6001600160e01b0319808e16908161141a57505050899a9b50611394826020999a9b9594936113ab9361113d565b9660501c965b858c8061140b575b505036916106e0565b6101408501526113cf604051998a9788968794633a871cdd60e01b86528501611213565b0393165af19182156106195761074193926113eb575b50611d7e565b61140491925060203d811161092b5761091d81836101de565b90386113e5565b81808092335af150858c6113a2565b9199509197969594939c8660e01b161615156000146114445760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114e3575061148561148061135f8b606460209c9d013501602486820135910161112f565b61105e565b60018101549099906001600160a01b031696848816156114d8575b50816113ab926114af9261113d565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961139a565b60501c9650816114a0565b9198979095509250600160e11b036115295761151f6113ab948a9361151a61135f8a606460209c01350160248d820135910161112f565b61160c565b919992969161139a565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061156b57505050565b60140360031b82901b16169150565b359060208110611588575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610741949281528160208201520191611597565b6001600160d01b031990358181169392600681106115ec57505050565b60060360031b82901b16169150565b916020610741938181520191611597565b9061163861162c611626611620868561115a565b90611549565b60601c90565b6001600160a01b031690565b9361164c611646858461116b565b9061157a565b60588301607882019461166761164687856058018a896111c0565b96611770611678611646838961117c565b611688611626611620858b61118d565b996117166116973689896106e0565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170e60c0826101de565b5190206118d6565b600080516020611de583398151915254909190611752906117429060501c6001600160a01b031661162c565b9189019b60788d0190878d6111c0565b60405163199ed7c960e11b81529586948593849391600485016115b8565b03915afa928315610619576114806117b661186595610521946000916118b9575b506117af61179f878d61117c565b6001600160a01b0319929161157a565b1690611d7e565b9a898b016078019a85036077190199611855906118456117e86117e26117dc8a8561119e565b906115cf565b60d01c90565b9761181c61162c6116266116206118056117e26117dc878a6111af565b94611816611626611620838b61118d565b9761115a565b946118366118286101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189b926000928360405180968195829463064acaab60e11b8452600484016115fb565b03925af18015610619576118ac5750565b8061060d61020c92610190565b6118d091508d803d1061092b5761091d81836101de565b38611791565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611963575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611944565b600080516020611de583398151915254611a3793602093909291611a199060501c6001600160a01b031661162c565b916040519586948593849363199ed7c960e11b8552600485016115b8565b03915afa801561061957611a5391600091611ac1575b50611adf565b60208101514265ffffffffffff90911611611ab45742611a8a611a7f604084015165ffffffffffff1690565b65ffffffffffff1690565b10611ab457516001600160a01b0316611aa857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b611ad9915060203d811161092b5761091d81836101de565b38611a4d565b604080516001600160401b03929060608101848111828210176101a35760009184918252828152826020820152015265ffffffffffff90818160a01c16908115611b54575b83519460608601908111868210176101a35784526001600160a01b038116855260d01c6020850152169082015290565b829150611b24565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611de583398151915254611bd29060501c6001600160a01b031661162c565b6040519081639ea9bd5960e01b9182825260209384918180611bf8363360048401611b74565b03915afa90811561061957600091611d14575b50611d0d57611c256000356001600160e01b03191661105e565b6001810154909190611c3f906001600160a01b031661162c565b916001600160a01b03831615908115611cd4575b8115611cbf575b5015611c6857505050600090565b829060405192839182528180611c82363360048401611b74565b03915afa91821561061957600092611c9957505090565b6107419250803d10611cb8575b611cb081836101de565b810190611b5c565b503d611ca6565b544265ffffffffffff90911611905038611c5a565b905065ffffffffffff611cf1825465ffffffffffff9060301c1690565b168015159081611d03575b5090611c53565b9050421138611cfc565b5050600190565b611d2b9150833d8511611cb857611cb081836101de565b38611c0b565b600080516020611de583398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611d99575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611ddc575b5081811190821802181790565b925038611dcf56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x5", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x9", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "hash": "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0xe0068", + "gas": "0xf2137", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610aee38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a2090816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107915781632569296214610746578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610806565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610806565b9061014b61084f565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610806565b906101b861084f565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a610899565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361084f565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d1906109d4565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761084f565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610806565b90602435918215158093036103975761037661084f565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461084f565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610806565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261084f565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a6020923561086c565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610821565b6105948580518381948a830196873781016024358a82015203888101845201826109fe565b5190201661086c565b8391506060366003190112610128576105b4610806565b9260243567ffffffffffffffff8111610397576105d49036908401610821565b94909360018060a01b039384831682526020966001885260ff8584205416156106f1576bffffffffffffffffffffffff855189810190838a833761062c88828d8782019060443590820152038d8101845201826109fe565b51902016903315600117156106e557610643610899565b9160896013840186f59788156106d957918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106bf57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a35191168152f35b3d156106ce57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b82632f6348368552601cfd5b845162461bcd60e51b8152808301899052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126108025782823563ffffffff8116809103610128576107b961084f565b81546001600160a01b031693843b156108025760249084519586938492621cb65b60e51b845283015234905af19081156102db57506107f6575080f35b6107ff906109d4565b80f35b8280fd5b600435906001600160a01b038216820361081c57565b600080fd5b9181601f8401121561081c5782359167ffffffffffffffff831161081c576020838186019501011161081c57565b638b78c6d81954330361085e57565b6382b429006000526004601cfd5b60896013610878610899565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561093d57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff81116109e857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176109e857604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "nonce": "0x6", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0xa", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "hash": "0x4d4250c8424c25122dfb19922a456aae922da996906aa64e2efb89b1bde0a6a6", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "setImplementation(address,bool)", "arguments": [ - "0xD2063bE7C610eb55492C05385743edDbf5b6B951", + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", "true" ], "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x10945", "value": "0x0", - "data": "0xbb30a974000000000000000000000000d2063be7c610eb55492c05385743eddbf5b6b9510000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x7", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xb", "accessList": [] }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "hash": "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223", "transactionType": "CALL", "contractName": "KernelFactory", - "contractAddress": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": "addStake(uint32)", "arguments": [ "1" @@ -75,11 +75,11 @@ "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", - "to": "0x85df6dc686fbdcac7da61651d116fc71b2246b50", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", "gas": "0x1da73", "value": "0x1", "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x8", + "nonce": "0xc", "accessList": [] }, "additionalContracts": [], @@ -88,14 +88,14 @@ ], "receipts": [ { - "transactionHash": "0x3ca84beee0a444f08e0e0a1cb9fed60dfc514af1ba8ab82f6c41777a6361f4f9", + "transactionHash": "0x621c9a10560ae46f80eb4162ce1d6d7b5999cd2834a2c042ecd90c00a710ea9d", "transactionIndex": "0x1", - "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", - "blockNumber": "0x7c90de", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x1b4bd2", - "gasUsed": "0x1a94a9", + "cumulativeGasUsed": "0x1b145e", + "gasUsed": "0x1a4f55", "contractAddress": null, "logs": [], "status": "0x1", @@ -104,45 +104,45 @@ "effectiveGasPrice": "0xb2d05e32" }, { - "transactionHash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "transactionHash": "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", "transactionIndex": "0x2", - "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", - "blockNumber": "0x7c90de", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x256edf", - "gasUsed": "0xa230d", + "cumulativeGasUsed": "0x256cb9", + "gasUsed": "0xa585b", "contractAddress": null, "logs": [ { - "address": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" ], "data": "0x", - "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", - "blockNumber": "0x7c90de", - "transactionHash": "0xb1b6d3969f04ab00f884a73d3cea14e01277cc18e88f5a6c38ac775854e5e37e", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "transactionHash": "0x8b48729a09052747d35d95daa1ef3c48b22099cca0513ced7020da1b879bd4ad", "transactionIndex": "0x2", "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000200000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", "effectiveGasPrice": "0xb2d05e32" }, { - "transactionHash": "0x494b0856d6779e1058bfde9f29e19c636daf59c858e93f2041bf337904213c31", + "transactionHash": "0x4d4250c8424c25122dfb19922a456aae922da996906aa64e2efb89b1bde0a6a6", "transactionIndex": "0x3", - "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", - "blockNumber": "0x7c90de", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x262441", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x26221b", "gasUsed": "0xb562", "contractAddress": null, "logs": [], @@ -152,13 +152,13 @@ "effectiveGasPrice": "0xb2d05e32" }, { - "transactionHash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "transactionHash": "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223", "transactionIndex": "0x4", - "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", - "blockNumber": "0x7c90de", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", - "to": "0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50", - "cumulativeGasUsed": "0x2768aa", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x276684", "gasUsed": "0x14469", "contractAddress": null, "logs": [ @@ -166,19 +166,19 @@ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "topics": [ "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", - "0x00000000000000000000000085df6dc686fbdcac7da61651d116fc71b2246b50" + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0xf505c2a8f7175ffdeb05c56cf9fa3ba0c5d5879ca036391279a3b6e21be32fd5", - "blockNumber": "0x7c90de", - "transactionHash": "0x79e651fa5778767957385ecef3ca5500ef6a19a5154eeb84e5a1daa8edc076cd", + "blockHash": "0xe2f79cec09ad5e891c6bc166d9293896afce3e3e69307874478f95b13d25c424", + "blockNumber": "0x80c9b9", + "transactionHash": "0x669c62c539087c89672b9b250cda1ce2398d5bc82031c6f6831ac25f3d113223", "transactionIndex": "0x4", "logIndex": "0x1", "removed": false } ], "status": "0x1", - "logsBloom": "0x00080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", "type": "0x2", "effectiveGasPrice": "0xb2d05e32" } @@ -186,8 +186,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691520719, + "timestamp": 1692074119, "chain": 84531, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/1/run-1692154988.json b/broadcast/DeploySessionKey.s.sol/1/run-1692154988.json new file mode 100644 index 00000000..7ab417a1 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/1/run-1692154988.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x4f1452697b40c91261a6ddb1eea2ecff90331d3666e0cc2daec0b9b5dc6391ae", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x10", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x4f1452697b40c91261a6ddb1eea2ecff90331d3666e0cc2daec0b9b5dc6391ae" + ], + "returns": {}, + "timestamp": 1692154988, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/1/run-1692154995.json b/broadcast/DeploySessionKey.s.sol/1/run-1692154995.json new file mode 100644 index 00000000..cde10cbf --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/1/run-1692154995.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x4f1452697b40c91261a6ddb1eea2ecff90331d3666e0cc2daec0b9b5dc6391ae", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x10", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x4f1452697b40c91261a6ddb1eea2ecff90331d3666e0cc2daec0b9b5dc6391ae", + "transactionIndex": "0x23", + "blockHash": "0x9483d75acaf6d54cd89c751d4cc60e025296ebeccf5e30a0a5ab7d0786ba499c", + "blockNumber": "0x11181ea", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x461f7a", + "gasUsed": "0xe74af", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x646adeae8" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692154995, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/1/run-latest.json b/broadcast/DeploySessionKey.s.sol/1/run-latest.json new file mode 100644 index 00000000..cde10cbf --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/1/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x4f1452697b40c91261a6ddb1eea2ecff90331d3666e0cc2daec0b9b5dc6391ae", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x10", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x4f1452697b40c91261a6ddb1eea2ecff90331d3666e0cc2daec0b9b5dc6391ae", + "transactionIndex": "0x23", + "blockHash": "0x9483d75acaf6d54cd89c751d4cc60e025296ebeccf5e30a0a5ab7d0786ba499c", + "blockNumber": "0x11181ea", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x461f7a", + "gasUsed": "0xe74af", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x646adeae8" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692154995, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10/run-1692128944.json b/broadcast/DeploySessionKey.s.sol/10/run-1692128944.json new file mode 100644 index 00000000..3fe2b241 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10/run-1692128944.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x807e7a9b05a6bd52054136d0e0d02cc21bb9fdbfc97f8781fd0a6ac0ab7eff3d", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x807e7a9b05a6bd52054136d0e0d02cc21bb9fdbfc97f8781fd0a6ac0ab7eff3d" + ], + "returns": {}, + "timestamp": 1692128944, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10/run-1692128951.json b/broadcast/DeploySessionKey.s.sol/10/run-1692128951.json new file mode 100644 index 00000000..a6710c16 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10/run-1692128951.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x807e7a9b05a6bd52054136d0e0d02cc21bb9fdbfc97f8781fd0a6ac0ab7eff3d", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x807e7a9b05a6bd52054136d0e0d02cc21bb9fdbfc97f8781fd0a6ac0ab7eff3d", + "transactionIndex": "0x1", + "blockHash": "0x74c19fc6cd861cf29a7e83013b83a590dc9a9e09e9f2cd256cac47481e855201", + "blockNumber": "0x673fe7d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf2aec", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb8f08622" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128951, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10/run-latest.json b/broadcast/DeploySessionKey.s.sol/10/run-latest.json new file mode 100644 index 00000000..a6710c16 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x807e7a9b05a6bd52054136d0e0d02cc21bb9fdbfc97f8781fd0a6ac0ab7eff3d", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x807e7a9b05a6bd52054136d0e0d02cc21bb9fdbfc97f8781fd0a6ac0ab7eff3d", + "transactionIndex": "0x1", + "blockHash": "0x74c19fc6cd861cf29a7e83013b83a590dc9a9e09e9f2cd256cac47481e855201", + "blockNumber": "0x673fe7d", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf2aec", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb8f08622" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128951, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/100/run-1692129514.json b/broadcast/DeploySessionKey.s.sol/100/run-1692129514.json new file mode 100644 index 00000000..d0869229 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/100/run-1692129514.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xa6e7e74b1155d585cdcfb0c451ca4e628fca0583a2d55d5c03e92b34b18e9009", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xa6e7e74b1155d585cdcfb0c451ca4e628fca0583a2d55d5c03e92b34b18e9009" + ], + "returns": {}, + "timestamp": 1692129514, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/100/run-1692129521.json b/broadcast/DeploySessionKey.s.sol/100/run-1692129521.json new file mode 100644 index 00000000..af665d14 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/100/run-1692129521.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xa6e7e74b1155d585cdcfb0c451ca4e628fca0583a2d55d5c03e92b34b18e9009", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa6e7e74b1155d585cdcfb0c451ca4e628fca0583a2d55d5c03e92b34b18e9009", + "transactionIndex": "0x0", + "blockHash": "0xd393a7b2e81eff5fc79d598d37ffde784a47a2bb82110f8de1d7b5d463c90f42", + "blockNumber": "0x1c1cb9b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe74af", + "gasUsed": "0xe74af", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129521, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/100/run-latest.json b/broadcast/DeploySessionKey.s.sol/100/run-latest.json new file mode 100644 index 00000000..af665d14 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/100/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xa6e7e74b1155d585cdcfb0c451ca4e628fca0583a2d55d5c03e92b34b18e9009", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa6e7e74b1155d585cdcfb0c451ca4e628fca0583a2d55d5c03e92b34b18e9009", + "transactionIndex": "0x0", + "blockHash": "0xd393a7b2e81eff5fc79d598d37ffde784a47a2bb82110f8de1d7b5d463c90f42", + "blockNumber": "0x1c1cb9b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe74af", + "gasUsed": "0xe74af", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129521, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10200/run-1692074391.json b/broadcast/DeploySessionKey.s.sol/10200/run-1692074391.json new file mode 100644 index 00000000..53236866 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10200/run-1692074391.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x8668a335a3cd6002787202d06a38801146adfe5b6e8f79024b90050e6337f0b8", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x8668a335a3cd6002787202d06a38801146adfe5b6e8f79024b90050e6337f0b8" + ], + "returns": {}, + "timestamp": 1692074391, + "chain": 10200, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10200/run-1692074398.json b/broadcast/DeploySessionKey.s.sol/10200/run-1692074398.json new file mode 100644 index 00000000..ebc52613 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/10200/run-1692074398.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x8668a335a3cd6002787202d06a38801146adfe5b6e8f79024b90050e6337f0b8", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x8668a335a3cd6002787202d06a38801146adfe5b6e8f79024b90050e6337f0b8", + "transactionIndex": "0x1", + "blockHash": "0x340684b7121eeabe4e206761713c25c6c0bdf208d58b7141d98cb897a4a45ce2", + "blockNumber": "0x542129", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xedc8f", + "gasUsed": "0xe74af", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e07" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692074398, + "chain": 10200, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/10200/run-latest.json b/broadcast/DeploySessionKey.s.sol/10200/run-latest.json index 26a446b9..ebc52613 100644 --- a/broadcast/DeploySessionKey.s.sol/10200/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/10200/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4", + "hash": "0x8668a335a3cd6002787202d06a38801146adfe5b6e8f79024b90050e6337f0b8", "transactionType": "CREATE2", "contractName": "ExecuteSessionKeyValidator", - "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x152b70", + "gas": "0x1522c3", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", - "nonce": "0x6", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x7", "accessList": [] }, "additionalContracts": [], @@ -23,14 +23,14 @@ ], "receipts": [ { - "transactionHash": "0x436f650b7e6411510489f5d199eeb7196258c54979045be4b5b2a94962f7e9c4", - "transactionIndex": "0x2", - "blockHash": "0xff82e1859f7f22ec177d30db47ce99bc7c846bc18a7ed5de3f6f93ea9f4bca3f", - "blockNumber": "0x52714d", + "transactionHash": "0x8668a335a3cd6002787202d06a38801146adfe5b6e8f79024b90050e6337f0b8", + "transactionIndex": "0x1", + "blockHash": "0x340684b7121eeabe4e206761713c25c6c0bdf208d58b7141d98cb897a4a45ce2", + "blockNumber": "0x542129", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0xf51d0", - "gasUsed": "0xe7aa0", + "cumulativeGasUsed": "0xedc8f", + "gasUsed": "0xe74af", "contractAddress": null, "logs": [], "status": "0x1", @@ -42,8 +42,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691520846, + "timestamp": 1692074398, "chain": 10200, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/137/run-1692128336.json b/broadcast/DeploySessionKey.s.sol/137/run-1692128336.json new file mode 100644 index 00000000..c9e3faaa --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/137/run-1692128336.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x20" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420" + ], + "returns": {}, + "timestamp": 1692128336, + "chain": 137, + "multi": false, + "commit": "0c7edd3" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/137/run-1692128368.json b/broadcast/DeploySessionKey.s.sol/137/run-1692128368.json new file mode 100644 index 00000000..4544108e --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/137/run-1692128368.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x20" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420", + "transactionIndex": "0x29", + "blockHash": "0x3b6fccbd0c26d67e0eefd24a717802ce2502ed9f6437efe1201d6aa26953beb6", + "blockNumber": "0x2c3366b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x55842f", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x00000000000000000000000046a3a41bd932244dd08186e4c19f1a7e48cbcdf4" + ], + "data": "0x000000000000000000000000000000000000000000000000006ef645201155650000000000000000000000000000000000000000000000172792ba5ad13a69530000000000000000000000000000000000000000000037b93f5cb7bbe4974ee10000000000000000000000000000000000000000000000172723c415b12913ee0000000000000000000000000000000000000000000037b93fcbae0104a8a446", + "blockHash": "0x3b6fccbd0c26d67e0eefd24a717802ce2502ed9f6437efe1201d6aa26953beb6", + "blockNumber": "0x2c3366b", + "transactionHash": "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420", + "transactionIndex": "0x29", + "logIndex": "0x7f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000800000000000000000000000000000000000000000000000004000000000000000000001800000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100002", + "type": "0x0", + "effectiveGasPrice": "0x14e0360a9d" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128368, + "chain": 137, + "multi": false, + "commit": "0c7edd3" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/137/run-latest.json b/broadcast/DeploySessionKey.s.sol/137/run-latest.json new file mode 100644 index 00000000..4544108e --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/137/run-latest.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x20" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420", + "transactionIndex": "0x29", + "blockHash": "0x3b6fccbd0c26d67e0eefd24a717802ce2502ed9f6437efe1201d6aa26953beb6", + "blockNumber": "0x2c3366b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x55842f", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x00000000000000000000000046a3a41bd932244dd08186e4c19f1a7e48cbcdf4" + ], + "data": "0x000000000000000000000000000000000000000000000000006ef645201155650000000000000000000000000000000000000000000000172792ba5ad13a69530000000000000000000000000000000000000000000037b93f5cb7bbe4974ee10000000000000000000000000000000000000000000000172723c415b12913ee0000000000000000000000000000000000000000000037b93fcbae0104a8a446", + "blockHash": "0x3b6fccbd0c26d67e0eefd24a717802ce2502ed9f6437efe1201d6aa26953beb6", + "blockNumber": "0x2c3366b", + "transactionHash": "0x22f8a9fe06cb1d23677cda53fd2c4b8ca6f414aea32d0f1f6bb583cd3b064420", + "transactionIndex": "0x29", + "logIndex": "0x7f", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000800000000000000000000000000000000000000000000000004000000000000000000001800000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100002", + "type": "0x0", + "effectiveGasPrice": "0x14e0360a9d" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128368, + "chain": 137, + "multi": false, + "commit": "0c7edd3" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/420/run-1692073753.json b/broadcast/DeploySessionKey.s.sol/420/run-1692073753.json new file mode 100644 index 00000000..96adcd57 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/420/run-1692073753.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xaec1f0d2d0fac979381a27ca8e789038f147533422f850f155969107460f866d", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xaec1f0d2d0fac979381a27ca8e789038f147533422f850f155969107460f866d" + ], + "returns": {}, + "timestamp": 1692073753, + "chain": 420, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/420/run-1692073760.json b/broadcast/DeploySessionKey.s.sol/420/run-1692073760.json new file mode 100644 index 00000000..dca9e706 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/420/run-1692073760.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xaec1f0d2d0fac979381a27ca8e789038f147533422f850f155969107460f866d", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xaec1f0d2d0fac979381a27ca8e789038f147533422f850f155969107460f866d", + "transactionIndex": "0x1", + "blockHash": "0x7dbcdbae7d072bbf1f8c10e68e51dd0f1fdd60a4707e8450d637756402318c3f", + "blockNumber": "0xcb4a5b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf2dd0", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692073760, + "chain": 420, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/420/run-latest.json b/broadcast/DeploySessionKey.s.sol/420/run-latest.json index 57541b9f..dca9e706 100644 --- a/broadcast/DeploySessionKey.s.sol/420/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/420/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295", + "hash": "0xaec1f0d2d0fac979381a27ca8e789038f147533422f850f155969107460f866d", "transactionType": "CREATE2", "contractName": "ExecuteSessionKeyValidator", - "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x152b70", + "gas": "0x1522c3", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", - "nonce": "0x4", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", "accessList": [] }, "additionalContracts": [], @@ -23,27 +23,27 @@ ], "receipts": [ { - "transactionHash": "0xe485282460c458e57a5aa69e6cd698270ebe5a1cebcd5d8b422ccc665a5a9295", + "transactionHash": "0xaec1f0d2d0fac979381a27ca8e789038f147533422f850f155969107460f866d", "transactionIndex": "0x1", - "blockHash": "0xf5f204cfd538d0416aa8e1eb946acca1cae5e70d99acdc8fc36e9272e951dfb3", - "blockNumber": "0xc70d22", + "blockHash": "0x7dbcdbae7d072bbf1f8c10e68e51dd0f1fdd60a4707e8450d637756402318c3f", + "blockNumber": "0xcb4a5b", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0xf30c3", - "gasUsed": "0xe799a", + "cumulativeGasUsed": "0xf2dd0", + "gasUsed": "0xe73ab", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0xb2d05e34" + "effectiveGasPrice": "0xb2d05e32" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691518126, + "timestamp": 1692073760, "chain": 420, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/42161/run-1692128782.json b/broadcast/DeploySessionKey.s.sol/42161/run-1692128782.json new file mode 100644 index 00000000..49809bb8 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/42161/run-1692128782.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xbcddbef5f84c94aeef651b6b09c145c66c6df6fd54a19ebdc62ef7a9af1544a7", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1f08403", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xbcddbef5f84c94aeef651b6b09c145c66c6df6fd54a19ebdc62ef7a9af1544a7", + "transactionIndex": "0x1", + "blockHash": "0xe2302c86f8bf9c2ce8749a4018449da345d9de985ee7377296c764ac529bc2bb", + "blockNumber": "0x7417123", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1554900", + "gasUsed": "0x1554900", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128782, + "chain": 42161, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/42161/run-latest.json b/broadcast/DeploySessionKey.s.sol/42161/run-latest.json new file mode 100644 index 00000000..49809bb8 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/42161/run-latest.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xbcddbef5f84c94aeef651b6b09c145c66c6df6fd54a19ebdc62ef7a9af1544a7", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1f08403", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xbcddbef5f84c94aeef651b6b09c145c66c6df6fd54a19ebdc62ef7a9af1544a7", + "transactionIndex": "0x1", + "blockHash": "0xe2302c86f8bf9c2ce8749a4018449da345d9de985ee7377296c764ac529bc2bb", + "blockNumber": "0x7417123", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1554900", + "gasUsed": "0x1554900", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128782, + "chain": 42161, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/421613/run-1692072464.json b/broadcast/DeploySessionKey.s.sol/421613/run-1692072464.json new file mode 100644 index 00000000..47a28165 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/421613/run-1692072464.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x9e32d03c85984c67d0baee90689c9303dc1d46d598ace131952e7066cbc320ea", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x130bf5", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9e32d03c85984c67d0baee90689c9303dc1d46d598ace131952e7066cbc320ea", + "transactionIndex": "0x1", + "blockHash": "0xc35c00f94a20892ad6bc2722376319af95040e92ad9253feb343dbd370c6fdb9", + "blockNumber": "0x20d6521", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe73ab", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692072464, + "chain": 421613, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/421613/run-latest.json b/broadcast/DeploySessionKey.s.sol/421613/run-latest.json index a0778419..47a28165 100644 --- a/broadcast/DeploySessionKey.s.sol/421613/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/421613/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xc9ab82ff9492897aaf27fbced8e28a9c215b52f467abd4caa6b8a0db7dd0c148", + "hash": "0x9e32d03c85984c67d0baee90689c9303dc1d46d598ace131952e7066cbc320ea", "transactionType": "CREATE2", "contractName": "ExecuteSessionKeyValidator", - "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x1313c9", + "gas": "0x130bf5", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", - "nonce": "0x4", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", "accessList": [] }, "additionalContracts": [], @@ -23,27 +23,27 @@ ], "receipts": [ { - "transactionHash": "0xc9ab82ff9492897aaf27fbced8e28a9c215b52f467abd4caa6b8a0db7dd0c148", + "transactionHash": "0x9e32d03c85984c67d0baee90689c9303dc1d46d598ace131952e7066cbc320ea", "transactionIndex": "0x1", - "blockHash": "0x102fe427bc0cd00b9d3acaa3f269b22d8f3035f7c4859c0b5402bda4f8c51b2b", - "blockNumber": "0x1fead1b", + "blockHash": "0xc35c00f94a20892ad6bc2722376319af95040e92ad9253feb343dbd370c6fdb9", + "blockNumber": "0x20d6521", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0xe799a", - "gasUsed": "0xe799a", + "cumulativeGasUsed": "0xe73ab", + "gasUsed": "0xe73ab", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x5aaedfd00" + "effectiveGasPrice": "0x5f5e100" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691520310, + "timestamp": 1692072464, "chain": 421613, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43113/run-1692073040.json b/broadcast/DeploySessionKey.s.sol/43113/run-1692073040.json new file mode 100644 index 00000000..49875c9f --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43113/run-1692073040.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x391bda89d8d96e4877db9610b48a3e78d9de707d4a95b0339ed401062677b347", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x391bda89d8d96e4877db9610b48a3e78d9de707d4a95b0339ed401062677b347" + ], + "returns": {}, + "timestamp": 1692073040, + "chain": 43113, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43113/run-1692073046.json b/broadcast/DeploySessionKey.s.sol/43113/run-1692073046.json new file mode 100644 index 00000000..3694b0c5 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43113/run-1692073046.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x391bda89d8d96e4877db9610b48a3e78d9de707d4a95b0339ed401062677b347", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x391bda89d8d96e4877db9610b48a3e78d9de707d4a95b0339ed401062677b347", + "transactionIndex": "0x0", + "blockHash": "0xc8a502784a73b44e25f5367c1a146d742e85da5fbede613b3ef217fb7d4cb642", + "blockNumber": "0x17d9eac", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xe73ab", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692073046, + "chain": 43113, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43113/run-latest.json b/broadcast/DeploySessionKey.s.sol/43113/run-latest.json index 5e3fe7cd..3694b0c5 100644 --- a/broadcast/DeploySessionKey.s.sol/43113/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/43113/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4", + "hash": "0x391bda89d8d96e4877db9610b48a3e78d9de707d4a95b0339ed401062677b347", "transactionType": "CREATE2", "contractName": "ExecuteSessionKeyValidator", - "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x152b70", + "gas": "0x1522c3", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", - "nonce": "0x4", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xa", "accessList": [] }, "additionalContracts": [], @@ -23,14 +23,14 @@ ], "receipts": [ { - "transactionHash": "0xcba0f5cb005c796e0947151cb9f5d66b402838f13647b8cc040fcb9ca0c2aed4", + "transactionHash": "0x391bda89d8d96e4877db9610b48a3e78d9de707d4a95b0339ed401062677b347", "transactionIndex": "0x0", - "blockHash": "0x6b45ca86d1221d6800f2350f1d193d3b3d68387c390086d15f7575b3213ecf9a", - "blockNumber": "0x17b4492", + "blockHash": "0xc8a502784a73b44e25f5367c1a146d742e85da5fbede613b3ef217fb7d4cb642", + "blockNumber": "0x17d9eac", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0xe799a", - "gasUsed": "0xe799a", + "cumulativeGasUsed": "0xe73ab", + "gasUsed": "0xe73ab", "contractAddress": null, "logs": [], "status": "0x1", @@ -42,8 +42,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691520642, + "timestamp": 1692073046, "chain": 43113, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43114/run-1692129118.json b/broadcast/DeploySessionKey.s.sol/43114/run-1692129118.json new file mode 100644 index 00000000..a3153fd3 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43114/run-1692129118.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x8e4de21534ffb1aa15a2ac7984210bb0fe764db579012ce5c59027ff257a9284", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x8e4de21534ffb1aa15a2ac7984210bb0fe764db579012ce5c59027ff257a9284" + ], + "returns": {}, + "timestamp": 1692129118, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43114/run-1692129131.json b/broadcast/DeploySessionKey.s.sol/43114/run-1692129131.json new file mode 100644 index 00000000..6697ddae --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43114/run-1692129131.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x8e4de21534ffb1aa15a2ac7984210bb0fe764db579012ce5c59027ff257a9284", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x8e4de21534ffb1aa15a2ac7984210bb0fe764db579012ce5c59027ff257a9284", + "transactionIndex": "0x5", + "blockHash": "0xcf7993453360e3e80f758c97fa036805c4737d9a837f845255e1bbe6211ca196", + "blockNumber": "0x2064268", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1f9f56", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129131, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/43114/run-latest.json b/broadcast/DeploySessionKey.s.sol/43114/run-latest.json new file mode 100644 index 00000000..6697ddae --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/43114/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x8e4de21534ffb1aa15a2ac7984210bb0fe764db579012ce5c59027ff257a9284", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x6", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x8e4de21534ffb1aa15a2ac7984210bb0fe764db579012ce5c59027ff257a9284", + "transactionIndex": "0x5", + "blockHash": "0xcf7993453360e3e80f758c97fa036805c4737d9a837f845255e1bbe6211ca196", + "blockNumber": "0x2064268", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1f9f56", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x684ee1800" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129131, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/5/run-1692071407.json b/broadcast/DeploySessionKey.s.sol/5/run-1692071407.json new file mode 100644 index 00000000..5e4a5230 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/5/run-1692071407.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x6b64d0937a0dec7b63f1b49b2acbfb5fd038940372066d0cf5ce47e4ef9f5f89", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4b" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x6b64d0937a0dec7b63f1b49b2acbfb5fd038940372066d0cf5ce47e4ef9f5f89" + ], + "returns": {}, + "timestamp": 1692071407, + "chain": 5, + "multi": false, + "commit": "e74c511" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/5/run-1692071413.json b/broadcast/DeploySessionKey.s.sol/5/run-1692071413.json new file mode 100644 index 00000000..bb597558 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/5/run-1692071413.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0x6b64d0937a0dec7b63f1b49b2acbfb5fd038940372066d0cf5ce47e4ef9f5f89", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4b" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x6b64d0937a0dec7b63f1b49b2acbfb5fd038940372066d0cf5ce47e4ef9f5f89", + "transactionIndex": "0x43", + "blockHash": "0x33d174077e51aa137ef49d0378df7edc64e8234bfd90da1bc511b97effd623a9", + "blockNumber": "0x9143ac", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xb18e22", + "gasUsed": "0xe74af", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e109" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692071413, + "chain": 5, + "multi": false, + "commit": "e74c511" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/5/run-latest.json b/broadcast/DeploySessionKey.s.sol/5/run-latest.json index d170fe78..bb597558 100644 --- a/broadcast/DeploySessionKey.s.sol/5/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/5/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01", + "hash": "0x6b64d0937a0dec7b63f1b49b2acbfb5fd038940372066d0cf5ce47e4ef9f5f89", "transactionType": "CREATE2", "contractName": "ExecuteSessionKeyValidator", - "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x152b70", + "gas": "0x1522c3", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", - "nonce": "0x45" + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4b" }, "additionalContracts": [], "isFixedGasLimit": false @@ -22,27 +22,27 @@ ], "receipts": [ { - "transactionHash": "0xe0a14f1f6c8451b3cc4a9404489edfa32529b788fce5cba06f05a4c23b477f01", - "transactionIndex": "0x3d", - "blockHash": "0xfcf73eb43bae1ae11a19a89063596aa0306132c86130fda5fadb60b9fd944f8e", - "blockNumber": "0x90b813", + "transactionHash": "0x6b64d0937a0dec7b63f1b49b2acbfb5fd038940372066d0cf5ce47e4ef9f5f89", + "transactionIndex": "0x43", + "blockHash": "0x33d174077e51aa137ef49d0378df7edc64e8234bfd90da1bc511b97effd623a9", + "blockNumber": "0x9143ac", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0xef4dd6", - "gasUsed": "0xe7aa0", + "cumulativeGasUsed": "0xb18e22", + "gasUsed": "0xe74af", "contractAddress": null, "logs": [], "status": "0x1", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x0", - "effectiveGasPrice": "0x48a74148" + "effectiveGasPrice": "0x5f5e109" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691517870, + "timestamp": 1692071413, "chain": 5, "multi": false, - "commit": "06a62a2" + "commit": "e74c511" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-1692030086.json b/broadcast/DeploySessionKey.s.sol/80001/run-1692030086.json new file mode 100644 index 00000000..1d41beee --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/80001/run-1692030086.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe9" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b" + ], + "returns": {}, + "timestamp": 1692030086, + "chain": 80001, + "multi": false, + "commit": "fde9e99" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-1692030093.json b/broadcast/DeploySessionKey.s.sol/80001/run-1692030093.json new file mode 100644 index 00000000..6117227b --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/80001/run-1692030093.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe9" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b", + "transactionIndex": "0x8", + "blockHash": "0xd4347e99f9f34f2a5196e6a31ec0f2dec666a0cb71606639be46972eb3f5ed98", + "blockNumber": "0x252f5eb", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2519c5", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x00000000000000000000000000000000000000000000000000050c1817b46500000000000000000000000000000000000000000000000000144568185323da72000000000000000000000000000000000000000000001288016a016f3d542d6900000000000000000000000000000000000000000000000014405c003b6f7572000000000000000000000000000000000000000000001288016f0d8755089269", + "blockHash": "0xd4347e99f9f34f2a5196e6a31ec0f2dec666a0cb71606639be46972eb3f5ed98", + "blockNumber": "0x252f5eb", + "transactionHash": "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b", + "transactionIndex": "0x8", + "logIndex": "0x1c", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692030093, + "chain": 80001, + "multi": false, + "commit": "fde9e99" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/80001/run-latest.json b/broadcast/DeploySessionKey.s.sol/80001/run-latest.json index d1a3e492..6117227b 100644 --- a/broadcast/DeploySessionKey.s.sol/80001/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/80001/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", + "hash": "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b", "transactionType": "CREATE2", "contractName": "ExecuteSessionKeyValidator", - "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x152b70", + "gas": "0x1522c3", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", - "nonce": "0xe3" + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe9" }, "additionalContracts": [], "isFixedGasLimit": false @@ -22,14 +22,14 @@ ], "receipts": [ { - "transactionHash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", - "transactionIndex": "0x10", - "blockHash": "0x3f08dfa76fd56ff482afd5a4c1130002c0ca5ba7e81b9885476269da91cd98db", - "blockNumber": "0x24fbf66", + "transactionHash": "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b", + "transactionIndex": "0x8", + "blockHash": "0xd4347e99f9f34f2a5196e6a31ec0f2dec666a0cb71606639be46972eb3f5ed98", + "blockNumber": "0x252f5eb", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x32f174", - "gasUsed": "0xe799a", + "cumulativeGasUsed": "0x2519c5", + "gasUsed": "0xe73ab", "contractAddress": null, "logs": [ { @@ -38,19 +38,19 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", - "0x000000000000000000000000f903ba9e006193c1527bfbe65fe2123704ea3f99" + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" ], - "data": "0x00000000000000000000000000000000000000000000000000050e2a98e34600000000000000000000000000000000000000000000000000145852c9926581ef00000000000000000000000000000000000000000000104dee61b5522b47e3680000000000000000000000000000000000000000000000001453449ef9823bef00000000000000000000000000000000000000000000104dee66c37cc42b2968", - "blockHash": "0x3f08dfa76fd56ff482afd5a4c1130002c0ca5ba7e81b9885476269da91cd98db", - "blockNumber": "0x24fbf66", - "transactionHash": "0xa27e38a47c7041f7acd8717c02f5f02373ca91303b7296cdfb45d743af2a5582", - "transactionIndex": "0x10", - "logIndex": "0x4a", + "data": "0x00000000000000000000000000000000000000000000000000050c1817b46500000000000000000000000000000000000000000000000000144568185323da72000000000000000000000000000000000000000000001288016a016f3d542d6900000000000000000000000000000000000000000000000014405c003b6f7572000000000000000000000000000000000000000000001288016f0d8755089269", + "blockHash": "0xd4347e99f9f34f2a5196e6a31ec0f2dec666a0cb71606639be46972eb3f5ed98", + "blockNumber": "0x252f5eb", + "transactionHash": "0xe61b1780434c498d9c99382e236692d8f37b6925e10331e9f5d348d4c235ce0b", + "transactionIndex": "0x8", + "logIndex": "0x1c", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000000000000000000000020000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000200000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", "effectiveGasPrice": "0x59682f10" } @@ -58,8 +58,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691516563, + "timestamp": 1692030093, "chain": 80001, "multi": false, - "commit": "3c4d8e8" + "commit": "fde9e99" } \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/8453/run-1692129384.json b/broadcast/DeploySessionKey.s.sol/8453/run-1692129384.json new file mode 100644 index 00000000..38ceb08f --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/8453/run-1692129384.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x9bff67b1f9eeac89a1c68cceeae991cbdb75de95b099543c6da16c74701b3a41", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x9bff67b1f9eeac89a1c68cceeae991cbdb75de95b099543c6da16c74701b3a41" + ], + "returns": {}, + "timestamp": 1692129384, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/8453/run-1692129391.json b/broadcast/DeploySessionKey.s.sol/8453/run-1692129391.json new file mode 100644 index 00000000..7d405f1d --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/8453/run-1692129391.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x9bff67b1f9eeac89a1c68cceeae991cbdb75de95b099543c6da16c74701b3a41", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9bff67b1f9eeac89a1c68cceeae991cbdb75de95b099543c6da16c74701b3a41", + "transactionIndex": "0x1", + "blockHash": "0x9d06bd6954eaf28b5b700247e5a3e143875c774c9531813863cb756a03248f39", + "blockNumber": "0x28bdc4", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf6db8", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e33" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129391, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/8453/run-latest.json b/broadcast/DeploySessionKey.s.sol/8453/run-latest.json new file mode 100644 index 00000000..7d405f1d --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/8453/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x9bff67b1f9eeac89a1c68cceeae991cbdb75de95b099543c6da16c74701b3a41", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x8", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9bff67b1f9eeac89a1c68cceeae991cbdb75de95b099543c6da16c74701b3a41", + "transactionIndex": "0x1", + "blockHash": "0x9d06bd6954eaf28b5b700247e5a3e143875c774c9531813863cb756a03248f39", + "blockNumber": "0x28bdc4", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf6db8", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e33" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692129391, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/84531/run-1692074181.json b/broadcast/DeploySessionKey.s.sol/84531/run-1692074181.json new file mode 100644 index 00000000..e04b6abf --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/84531/run-1692074181.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xf1762c965bb628d23aaaa618d9b1f4a30477c2274473676588b84a6dcf3a6a19", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xf1762c965bb628d23aaaa618d9b1f4a30477c2274473676588b84a6dcf3a6a19" + ], + "returns": {}, + "timestamp": 1692074181, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/84531/run-1692074188.json b/broadcast/DeploySessionKey.s.sol/84531/run-1692074188.json new file mode 100644 index 00000000..e5c6727c --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/84531/run-1692074188.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xf1762c965bb628d23aaaa618d9b1f4a30477c2274473676588b84a6dcf3a6a19", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xf1762c965bb628d23aaaa618d9b1f4a30477c2274473676588b84a6dcf3a6a19", + "transactionIndex": "0x1", + "blockHash": "0x0ee278887fc8473da042aeb283ee6a92a3d9bd362588783716348996d68c0ef9", + "blockNumber": "0x80c9dc", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xf2ab0", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e32" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692074188, + "chain": 84531, + "multi": false, + "commit": "951fd36" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/84531/run-latest.json b/broadcast/DeploySessionKey.s.sol/84531/run-latest.json index 4f4d80b5..e5c6727c 100644 --- a/broadcast/DeploySessionKey.s.sol/84531/run-latest.json +++ b/broadcast/DeploySessionKey.s.sol/84531/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2", + "hash": "0xf1762c965bb628d23aaaa618d9b1f4a30477c2274473676588b84a6dcf3a6a19", "transactionType": "CREATE2", "contractName": "ExecuteSessionKeyValidator", - "contractAddress": "0x8e632447954036ee940eB0a6bC5a20A18543C4Fd", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", "function": null, "arguments": null, "transaction": { "type": "0x02", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x152b70", + "gas": "0x1522c3", "value": "0x0", - "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611027908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fd6565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f7c578654968715610f4c5760010154958660601c60018114600014610ec357506105046101208301836103dc565b905015610e6f57610516905b826103dc565b806080999299528860a0528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60a05160558a81013590910101356001600160a01b038116810361033a57815260a0805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a57604082015260a051966001600160401b0360b560558c01358a0101351161033a57608051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260805160a05160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b60a051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160805101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d5939699506060870152013560a051010135600281101561033a57608084015260a051966001600160401b0360758901351161033a576080518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760805160a05190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b91013560a0510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e4b575b5015610dfa5761082560608201826103dc565b60441161033a576024602089015191013511610da35761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d4e5761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cff5760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cc457505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c8d575b50509050149283610b9e575b505050610b975760015b60ff16607082901b65ffffffffffff60a01b161760d09190911b6001600160d01b0319161790565b6000610b6f565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7f57600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9757915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5a60608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ed3575b5061051690610510565b610ee16101208401846103dc565b60141161033a573560601c03610ef75738610ec9565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60010154607081901b65ffffffffffff60a01b1660d09190911b6001600160d01b03191617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", - "nonce": "0x4", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0xe", "accessList": [] }, "additionalContracts": [], @@ -23,14 +23,14 @@ ], "receipts": [ { - "transactionHash": "0xa6f1aec7f11fd85ac32e9aaff69cab10c0060f1d049e98c6b0071ef4c92917f2", + "transactionHash": "0xf1762c965bb628d23aaaa618d9b1f4a30477c2274473676588b84a6dcf3a6a19", "transactionIndex": "0x1", - "blockHash": "0xbabbbea871abb966b5e6131be74d559c7f37e205ba85931cfe04c6a3f01e0bb6", - "blockNumber": "0x7c90cc", + "blockHash": "0x0ee278887fc8473da042aeb283ee6a92a3d9bd362588783716348996d68c0ef9", + "blockNumber": "0x80c9dc", "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0xf30c3", - "gasUsed": "0xe799a", + "cumulativeGasUsed": "0xf2ab0", + "gasUsed": "0xe73ab", "contractAddress": null, "logs": [], "status": "0x1", @@ -42,8 +42,8 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1691520682, + "timestamp": 1692074188, "chain": 84531, "multi": false, - "commit": "06a62a2" + "commit": "951fd36" } \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/1/run-1692156425.json b/broadcast/StakeToFactory.s.sol/1/run-1692156425.json new file mode 100644 index 00000000..936203fd --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/1/run-1692156425.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x13" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36" + ], + "returns": {}, + "timestamp": 1692156425, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/1/run-1692156438.json b/broadcast/StakeToFactory.s.sol/1/run-1692156438.json new file mode 100644 index 00000000..e1646c86 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/1/run-1692156438.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x13" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36", + "transactionIndex": "0x5b", + "blockHash": "0xd75c3a981ab777bd3f795bea09b366d87e36d1a167f83b2256b3345f8b931f86", + "blockNumber": "0x1118262", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x6250d2", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0xd75c3a981ab777bd3f795bea09b366d87e36d1a167f83b2256b3345f8b931f86", + "blockNumber": "0x1118262", + "transactionHash": "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36", + "transactionIndex": "0x5b", + "logIndex": "0xb8", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x4abf9f270" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692156438, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/1/run-latest.json b/broadcast/StakeToFactory.s.sol/1/run-latest.json new file mode 100644 index 00000000..e1646c86 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/1/run-latest.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x13" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36", + "transactionIndex": "0x5b", + "blockHash": "0xd75c3a981ab777bd3f795bea09b366d87e36d1a167f83b2256b3345f8b931f86", + "blockNumber": "0x1118262", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x6250d2", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0xd75c3a981ab777bd3f795bea09b366d87e36d1a167f83b2256b3345f8b931f86", + "blockNumber": "0x1118262", + "transactionHash": "0x057d860d6097d6314e89903093ebf8e2480b1773f4739fdc94de417a1433ae36", + "transactionIndex": "0x5b", + "logIndex": "0xb8", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x4abf9f270" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692156438, + "chain": 1, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/10/run-1692157058.json b/broadcast/StakeToFactory.s.sol/10/run-1692157058.json new file mode 100644 index 00000000..c75feb70 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/10/run-1692157058.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x9" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd" + ], + "returns": {}, + "timestamp": 1692157058, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/10/run-1692157065.json b/broadcast/StakeToFactory.s.sol/10/run-1692157065.json new file mode 100644 index 00000000..ecc4f33f --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/10/run-1692157065.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x9" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd", + "transactionIndex": "0x9", + "blockHash": "0x029cdad825502b283a6ebabc010f49be080547d85736528654442ee375e1ff03", + "blockNumber": "0x6743565", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x2b56a3", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x029cdad825502b283a6ebabc010f49be080547d85736528654442ee375e1ff03", + "blockNumber": "0x6743565", + "transactionHash": "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd", + "transactionIndex": "0x9", + "logIndex": "0x33", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x89eb" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157065, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/10/run-latest.json b/broadcast/StakeToFactory.s.sol/10/run-latest.json new file mode 100644 index 00000000..ecc4f33f --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/10/run-latest.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x9" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd", + "transactionIndex": "0x9", + "blockHash": "0x029cdad825502b283a6ebabc010f49be080547d85736528654442ee375e1ff03", + "blockNumber": "0x6743565", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x2b56a3", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x029cdad825502b283a6ebabc010f49be080547d85736528654442ee375e1ff03", + "blockNumber": "0x6743565", + "transactionHash": "0x74f9d553773e7f153feff0df4740cb1492e34c094b15100c742f13f5db2d31bd", + "transactionIndex": "0x9", + "logIndex": "0x33", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x89eb" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157065, + "chain": 10, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/100/run-1692157427.json b/broadcast/StakeToFactory.s.sol/100/run-1692157427.json new file mode 100644 index 00000000..8c667904 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/100/run-1692157427.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf" + ], + "returns": {}, + "timestamp": 1692157427, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/100/run-1692157434.json b/broadcast/StakeToFactory.s.sol/100/run-1692157434.json new file mode 100644 index 00000000..9576c178 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/100/run-1692157434.json @@ -0,0 +1,64 @@ +{ + "transactions": [ + { + "hash": "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf", + "transactionIndex": "0x1", + "blockHash": "0x57097052d5ad7a7e3dda775abc59746d04b8dd89739fd8470c4576e6e43df7fe", + "blockNumber": "0x1c1e071", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x24c3f", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x57097052d5ad7a7e3dda775abc59746d04b8dd89739fd8470c4576e6e43df7fe", + "blockNumber": "0x1c1e071", + "transactionHash": "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157434, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/100/run-latest.json b/broadcast/StakeToFactory.s.sol/100/run-latest.json new file mode 100644 index 00000000..9576c178 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/100/run-latest.json @@ -0,0 +1,64 @@ +{ + "transactions": [ + { + "hash": "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x7", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf", + "transactionIndex": "0x1", + "blockHash": "0x57097052d5ad7a7e3dda775abc59746d04b8dd89739fd8470c4576e6e43df7fe", + "blockNumber": "0x1c1e071", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x24c3f", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x57097052d5ad7a7e3dda775abc59746d04b8dd89739fd8470c4576e6e43df7fe", + "blockNumber": "0x1c1e071", + "transactionHash": "0xfadbf47c265c22c9f0dec82ce1791c7915711a1c57aedf34a3eb3d41e4c943cf", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e08" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157434, + "chain": 100, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/137/run-1692154620.json b/broadcast/StakeToFactory.s.sol/137/run-1692154620.json new file mode 100644 index 00000000..1bc8b46c --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/137/run-1692154620.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x3635c9adc5dea00000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x21" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c" + ], + "returns": {}, + "timestamp": 1692154620, + "chain": 137, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/137/run-1692154627.json b/broadcast/StakeToFactory.s.sol/137/run-1692154627.json new file mode 100644 index 00000000..ebc11b00 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/137/run-1692154627.json @@ -0,0 +1,111 @@ +{ + "transactions": [ + { + "hash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x3635c9adc5dea00000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x21" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x417987", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000004da172c1fc6e98731400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000176ba914368ff8731400000000000000000000000000000000000000000000003635c9adc5dea00000", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x79", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x00000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000002f2a347ff97a1271eba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000328d911ad5d7fc71eba", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x7a", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x7b", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x00000000000000000000000067b94473d81d0cd00849d563c94d0432ac988b49" + ], + "data": "0x0000000000000000000000000000000000000000000000000008f806e8e13ebf00000000000000000000000000000000000000000000004da1924804555acb7400000000000000000000000000000000000000000000108b524de6efeef1353c00000000000000000000000000000000000000000000004da1894ffd6c798cb500000000000000000000000000000000000000000000108b5256def6d7d273fb", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x7c", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000600000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000002000000004000800000000000000001000000008000000040000000800000108000000000000100020000000000000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x11011dd690" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692154627, + "chain": 137, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/137/run-latest.json b/broadcast/StakeToFactory.s.sol/137/run-latest.json new file mode 100644 index 00000000..ebc11b00 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/137/run-latest.json @@ -0,0 +1,111 @@ +{ + "transactions": [ + { + "hash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x3635c9adc5dea00000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x21" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x417987", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000004da172c1fc6e98731400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000176ba914368ff8731400000000000000000000000000000000000000000000003635c9adc5dea00000", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x79", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x00000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000002f2a347ff97a1271eba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000328d911ad5d7fc71eba", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x7a", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x00000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x7b", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x00000000000000000000000067b94473d81d0cd00849d563c94d0432ac988b49" + ], + "data": "0x0000000000000000000000000000000000000000000000000008f806e8e13ebf00000000000000000000000000000000000000000000004da1924804555acb7400000000000000000000000000000000000000000000108b524de6efeef1353c00000000000000000000000000000000000000000000004da1894ffd6c798cb500000000000000000000000000000000000000000000108b5256def6d7d273fb", + "blockHash": "0x833052126e12dc9537fa291fd145b356e6b13b2de8c970e3f4cb84730ad18b12", + "blockNumber": "0x2c365cf", + "transactionHash": "0x77a223bbc3d265f7a600f817bd24c38b3d8f023646dad5f6398cd5f5c874fd1c", + "transactionIndex": "0x1d", + "logIndex": "0x7c", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000600000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000000000000080000000000201000000000000000000000000000000000000000000000000002000000004000800000000000000001000000008000000040000000800000108000000000000100020000000000000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x11011dd690" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692154627, + "chain": 137, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/42161/run-1692157109.json b/broadcast/StakeToFactory.s.sol/42161/run-1692157109.json new file mode 100644 index 00000000..b1d0eee1 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/42161/run-1692157109.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x0b76662443f5bc595ffdc242336c5b420bbd17bb2782ad5e4765e414765cf626", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x978e6", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0xf" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x0b76662443f5bc595ffdc242336c5b420bbd17bb2782ad5e4765e414765cf626", + "transactionIndex": "0x1", + "blockHash": "0x858913fec551d70a4cdbc76dfb84eb0d2a753d4475d1694a13c5fbf26572ae4b", + "blockNumber": "0x742e755", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x5bc87", + "gasUsed": "0x5bc87", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x858913fec551d70a4cdbc76dfb84eb0d2a753d4475d1694a13c5fbf26572ae4b", + "blockNumber": "0x742e755", + "transactionHash": "0x0b76662443f5bc595ffdc242336c5b420bbd17bb2782ad5e4765e414765cf626", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157109, + "chain": 42161, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/42161/run-latest.json b/broadcast/StakeToFactory.s.sol/42161/run-latest.json new file mode 100644 index 00000000..b1d0eee1 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/42161/run-latest.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x0b76662443f5bc595ffdc242336c5b420bbd17bb2782ad5e4765e414765cf626", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x978e6", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0xf" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x0b76662443f5bc595ffdc242336c5b420bbd17bb2782ad5e4765e414765cf626", + "transactionIndex": "0x1", + "blockHash": "0x858913fec551d70a4cdbc76dfb84eb0d2a753d4475d1694a13c5fbf26572ae4b", + "blockNumber": "0x742e755", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x5bc87", + "gasUsed": "0x5bc87", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x858913fec551d70a4cdbc76dfb84eb0d2a753d4475d1694a13c5fbf26572ae4b", + "blockNumber": "0x742e755", + "transactionHash": "0x0b76662443f5bc595ffdc242336c5b420bbd17bb2782ad5e4765e414765cf626", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5f5e100" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157109, + "chain": 42161, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/43114/run-1692157199.json b/broadcast/StakeToFactory.s.sol/43114/run-1692157199.json new file mode 100644 index 00000000..aba73434 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/43114/run-1692157199.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76" + ], + "returns": {}, + "timestamp": 1692157199, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/43114/run-1692157206.json b/broadcast/StakeToFactory.s.sol/43114/run-1692157206.json new file mode 100644 index 00000000..2df9b486 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/43114/run-1692157206.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76", + "transactionIndex": "0x0", + "blockHash": "0xf757aef405e94d4bd052b6e204ddeed7bbb78f61dc351ddf19381e94f26378a0", + "blockNumber": "0x2067893", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x14481", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0xf757aef405e94d4bd052b6e204ddeed7bbb78f61dc351ddf19381e94f26378a0", + "blockNumber": "0x2067893", + "transactionHash": "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5d21dba00" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157206, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/43114/run-latest.json b/broadcast/StakeToFactory.s.sol/43114/run-latest.json new file mode 100644 index 00000000..2df9b486 --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/43114/run-latest.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76", + "transactionIndex": "0x0", + "blockHash": "0xf757aef405e94d4bd052b6e204ddeed7bbb78f61dc351ddf19381e94f26378a0", + "blockNumber": "0x2067893", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x14481", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0xf757aef405e94d4bd052b6e204ddeed7bbb78f61dc351ddf19381e94f26378a0", + "blockNumber": "0x2067893", + "transactionHash": "0xa448bb77fb8297a91e93666b6abd46bdbc775d90590af82f6326f6430e524c76", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x5d21dba00" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157206, + "chain": 43114, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/80001/run-1692128251.json b/broadcast/StakeToFactory.s.sol/80001/run-1692128251.json new file mode 100644 index 00000000..42719efa --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/80001/run-1692128251.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x11734", + "value": "0x8ac7230489e80000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0xf5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336" + ], + "returns": {}, + "timestamp": 1692128251, + "chain": 80001, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/80001/run-1692128258.json b/broadcast/StakeToFactory.s.sol/80001/run-1692128258.json new file mode 100644 index 00000000..8f5310df --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/80001/run-1692128258.json @@ -0,0 +1,111 @@ +{ + "transactions": [ + { + "hash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x11734", + "value": "0x8ac7230489e80000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0xf5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x2ad1d9", + "gasUsed": "0xbee9", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000a590f4fbbdbe375800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac9d1f733d637580000000000000000000000000000000000000000000000008ac7230489e80000", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0x8", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x0000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000009244454fc3045ff0f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092cf0c72c78e47f0f4", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0x9", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000008ac7230489e800010000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0xa", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x000000000000000000000000000000000000000000000000000047be0eb974d2000000000000000000000000000000000000000000000000a5915de7d06425000000000000000000000000000000000000000000000033c1ccf4c9d71c9a4c53000000000000000000000000000000000000000000000000a5911629c1aab02e0000000000000000000000000000000000000000000033c1ccf511952b53c125", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0xb", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004600000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000002000000004000000000000000000001000000000000000040000000800000108040000000000100000000000000000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x6033df12" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128258, + "chain": 80001, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/80001/run-latest.json b/broadcast/StakeToFactory.s.sol/80001/run-latest.json new file mode 100644 index 00000000..8f5310df --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/80001/run-latest.json @@ -0,0 +1,111 @@ +{ + "transactions": [ + { + "hash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x11734", + "value": "0x8ac7230489e80000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0xf5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x2ad1d9", + "gasUsed": "0xbee9", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000a590f4fbbdbe375800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac9d1f733d637580000000000000000000000000000000000000000000000008ac7230489e80000", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0x8", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3", + "0x0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" + ], + "data": "0x0000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000009244454fc3045ff0f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092cf0c72c78e47f0f4", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0x9", + "removed": false + }, + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000008ac7230489e800010000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0xa", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x000000000000000000000000000000000000000000000000000047be0eb974d2000000000000000000000000000000000000000000000000a5915de7d06425000000000000000000000000000000000000000000000033c1ccf4c9d71c9a4c53000000000000000000000000000000000000000000000000a5911629c1aab02e0000000000000000000000000000000000000000000033c1ccf511952b53c125", + "blockHash": "0x8a0c2b7cc4888225f67a9d4c47272fa74e3dd751ffc9d7ff8df68a567154fcaf", + "blockNumber": "0x25390b6", + "transactionHash": "0x557d4f94a996db81eab451f19ee1b44d39894769abe251252fffe28fc1440336", + "transactionIndex": "0x4", + "logIndex": "0xb", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200100000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004600000000080000000000000000000000000000000000004080800000000000000000000000000000000000000000000000000000000080000000080000000000201000000000000000000000000000000000000000000000000002000000004000000000000000000001000000000000000040000000800000108040000000000100000000000000000000000000000000000200000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x6033df12" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692128258, + "chain": 80001, + "multi": false, + "commit": "c78ecd8" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/8453/run-1692157271.json b/broadcast/StakeToFactory.s.sol/8453/run-1692157271.json new file mode 100644 index 00000000..60c5d22e --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/8453/run-1692157271.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562" + ], + "returns": {}, + "timestamp": 1692157271, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/8453/run-1692157277.json b/broadcast/StakeToFactory.s.sol/8453/run-1692157277.json new file mode 100644 index 00000000..ea6e450b --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/8453/run-1692157277.json @@ -0,0 +1,64 @@ +{ + "transactions": [ + { + "hash": "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562", + "transactionIndex": "0x1", + "blockHash": "0x7946a411d665a7e06cd596050ffa783d29e21d9700785126bd5cc18321096b99", + "blockNumber": "0x28f43b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x23e82", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x7946a411d665a7e06cd596050ffa783d29e21d9700785126bd5cc18321096b99", + "blockNumber": "0x28f43b", + "transactionHash": "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e3e" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157277, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/8453/run-latest.json b/broadcast/StakeToFactory.s.sol/8453/run-latest.json new file mode 100644 index 00000000..ea6e450b --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/8453/run-latest.json @@ -0,0 +1,64 @@ +{ + "transactions": [ + { + "hash": "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0x2386f26fc10000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x9", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562", + "transactionIndex": "0x1", + "blockHash": "0x7946a411d665a7e06cd596050ffa783d29e21d9700785126bd5cc18321096b99", + "blockNumber": "0x28f43b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x23e82", + "gasUsed": "0x14481", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0x7946a411d665a7e06cd596050ffa783d29e21d9700785126bd5cc18321096b99", + "blockNumber": "0x28f43b", + "transactionHash": "0x373d74f4583f6ed1709bc023d4040e8ee580e42d897114e0f635bfbc46f5d562", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xb2d05e3e" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692157277, + "chain": 8453, + "multi": false, + "commit": "4d26148" +} \ No newline at end of file diff --git a/gas/ecdsa/report.txt b/gas/ecdsa/report.txt index c97b8dcc..fdbba4dd 100644 --- a/gas/ecdsa/report.txt +++ b/gas/ecdsa/report.txt @@ -1,16 +1,16 @@ No files changed, compilation skipped Running 9 tests for test/foundry/Kernel.t.sol:KernelTest -[PASS] test_disable_mode() (gas: 162594) -[PASS] test_external_call_default() (gas: 28911) -[PASS] test_external_call_execution() (gas: 453201) -[PASS] test_initialize_twice() (gas: 20929) -[PASS] test_set_default_validator() (gas: 361067) -[PASS] test_set_execution() (gas: 411392) -[PASS] test_shoul_return_address_if_deployed() (gas: 8937393460516732963) -[PASS] test_validate_signature() (gas: 163650) -[PASS] test_validate_userOp() (gas: 1687848) -Test result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.60ms +[PASS] test_disable_mode() (gas: 162566) +[PASS] test_external_call_default() (gas: 28883) +[PASS] test_external_call_execution() (gas: 453173) +[PASS] test_initialize_twice() (gas: 20906) +[PASS] test_set_default_validator() (gas: 361039) +[PASS] test_set_execution() (gas: 411364) +[PASS] test_should_return_address_if_deployed() (gas: 24772) +[PASS] test_validate_signature() (gas: 166294) +[PASS] test_validate_userOp() (gas: 1687821) +Test result: ok. 9 passed; 0 failed; 0 skipped; finished in 3.59ms | src/Kernel.sol:Kernel contract | | | | | | |--------------------------------|-----------------|-------|--------|-------|---------| | Deployment Cost | Deployment Size | | | | | @@ -27,13 +27,13 @@ Test result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.60ms | validateUserOp | 45773 | 45967 | 45989 | 46119 | 4 | -| src/factory/KernelFactory.sol:KernelFactory contract | | | | | | -|------------------------------------------------------|-----------------|--------------------|--------|---------------------|---------| -| Deployment Cost | Deployment Size | | | | | -| 599207 | 3033 | | | | | -| Function Name | min | avg | median | max | # calls | -| createAccount | 131176 | 812490314592548788 | 131176 | 8937393460516717918 | 11 | -| setImplementation | 22852 | 22852 | 22852 | 22852 | 9 | +| src/factory/KernelFactory.sol:KernelFactory contract | | | | | | +|------------------------------------------------------|-----------------|--------|--------|--------|---------| +| Deployment Cost | Deployment Size | | | | | +| 577582 | 2925 | | | | | +| Function Name | min | avg | median | max | # calls | +| createAccount | 5962 | 122858 | 133848 | 140848 | 11 | +| setImplementation | 22862 | 22862 | 22862 | 22862 | 9 | diff --git a/scripts/DeployECDSAValidator.s.sol b/scripts/DeployECDSAValidator.s.sol new file mode 100644 index 00000000..89774599 --- /dev/null +++ b/scripts/DeployECDSAValidator.s.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.8.0; + +import "src/factory/KernelFactory.sol"; +import "src/validator/ECDSAValidator.sol"; +import "forge-std/Script.sol"; +import "forge-std/console.sol"; +contract DeployKernel is Script { + address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; + address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; + address constant EXPECTED_VALIDATOR_ADDRESS = 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390; + function run() public { + uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(key); + if(EXPECTED_VALIDATOR_ADDRESS.code.length == 0) { + ECDSAValidator validator = new ECDSAValidator{salt:0}(); + console.log("validator address: %s", address(validator)); + } else { + console.log("validator address: %s", EXPECTED_VALIDATOR_ADDRESS); + } + vm.stopBroadcast(); + } +} + diff --git a/scripts/DeployKernel.s.sol b/scripts/DeployKernel.s.sol index b91154a3..b4f11ee5 100644 --- a/scripts/DeployKernel.s.sol +++ b/scripts/DeployKernel.s.sol @@ -1,23 +1,23 @@ pragma solidity ^0.8.0; import "src/factory/KernelFactory.sol"; -import "src/validator/ECDSAValidator.sol"; import "account-abstraction/interfaces/IStakeManager.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; contract DeployKernel is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; - address constant EXPECTED_KERNEL_ADDRESS = 0xD2063bE7C610eb55492C05385743edDbf5b6B951; - address constant EXPECTED_KERNEL_FACTORY_ADDRESS = 0x85DF6Dc686FBDcAc7da61651D116fc71B2246B50; + address payable constant EXPECTED_KERNEL_ADDRESS = payable(0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb); + address payable constant EXPECTED_KERNEL_FACTORY_ADDRESS = payable(0x5de4839a76cf55d0c90e2061ef4386d962E15ae3); function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); - if(EXPECTED_KERNEL_ADDRESS.code.length == 0){ - Kernel kernel = new Kernel{salt:0}(IEntryPoint(ENTRYPOINT_0_6)); + Kernel kernel; + if(EXPECTED_KERNEL_ADDRESS.code.length == 0 ){ + kernel = new Kernel{salt:0}(IEntryPoint(ENTRYPOINT_0_6)); console.log("Kernel address: %s", address(kernel)); } else { - console.log("Kernel address: %s", address(EXPECTED_KERNEL_ADDRESS)); + kernel = Kernel(EXPECTED_KERNEL_ADDRESS); } KernelFactory factory; if(EXPECTED_KERNEL_FACTORY_ADDRESS.code.length == 0){ @@ -25,17 +25,15 @@ contract DeployKernel is Script { console.log("KernelFactory address: %s", address(factory)); } else { factory = KernelFactory(EXPECTED_KERNEL_FACTORY_ADDRESS); - console.log("KernelFactory address: %s", address(factory)); } - if(factory.isAllowedImplementation(address(EXPECTED_KERNEL_ADDRESS)) == false) { + if(factory.isAllowedImplementation(address(kernel)) == false) { console.log("Registering kernel implementation"); - factory.setImplementation(address(EXPECTED_KERNEL_ADDRESS), true); + factory.setImplementation(address(kernel), true); } IEntryPoint entryPoint = IEntryPoint(ENTRYPOINT_0_6); IStakeManager.DepositInfo memory info = entryPoint.getDepositInfo(address(factory)); if(info.stake == 0) { - console.log("Staking 1 wei to factory"); - factory.addStake{value:1}(1); + console.log("Need to stake to factory"); } vm.stopBroadcast(); } diff --git a/scripts/DeploySessionKey.s.sol b/scripts/DeploySessionKey.s.sol index a577b7bf..d800a6e9 100644 --- a/scripts/DeploySessionKey.s.sol +++ b/scripts/DeploySessionKey.s.sol @@ -4,7 +4,7 @@ import "src/validator/SessionKeyValidator.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; contract DeploySessionKey is Script { - address constant EXPECTED_ADDRESS_SESSION_KEY_VALIDATOR = 0x8e632447954036ee940eB0a6bC5a20A18543C4Fd; + address constant EXPECTED_ADDRESS_SESSION_KEY_VALIDATOR = 0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f; function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); @@ -12,8 +12,6 @@ contract DeploySessionKey is Script { console.log("deploying SessionKeyValidator"); ExecuteSessionKeyValidator validator = new ExecuteSessionKeyValidator{salt:0}(); console.log("validator address: %s", address(validator)); - } else { - console.log("validator address: %s", EXPECTED_ADDRESS_SESSION_KEY_VALIDATOR); } vm.stopBroadcast(); } diff --git a/scripts/StakeToFactory.s.sol b/scripts/StakeToFactory.s.sol new file mode 100644 index 00000000..c2b1b180 --- /dev/null +++ b/scripts/StakeToFactory.s.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.8.0; + +import "src/factory/KernelFactory.sol"; +import "account-abstraction/interfaces/IStakeManager.sol"; +import "forge-std/Script.sol"; +import "forge-std/console.sol"; +contract StakeToFactory is Script { + address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; + address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; + address payable constant EXPECTED_KERNEL_ADDRESS = payable(0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb); + address payable constant EXPECTED_KERNEL_FACTORY_ADDRESS = payable(0x5de4839a76cf55d0c90e2061ef4386d962E15ae3); + function run() public { + uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(key); + KernelFactory factory = KernelFactory(EXPECTED_KERNEL_FACTORY_ADDRESS); + IEntryPoint entryPoint = IEntryPoint(ENTRYPOINT_0_6); + IStakeManager.DepositInfo memory info = entryPoint.getDepositInfo(address(factory)); + if(info.stake < 1e16) { + factory.addStake{value: 1e16}(86400); + } + vm.stopBroadcast(); + } +} diff --git a/src/factory/AdminLessERC1967Factory.sol b/src/factory/AdminLessERC1967Factory.sol index a62268ca..2587d1c5 100644 --- a/src/factory/AdminLessERC1967Factory.sol +++ b/src/factory/AdminLessERC1967Factory.sol @@ -44,29 +44,6 @@ contract AdminLessERC1967Factory { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* DEPLOY FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ - - /// @dev Deploys a proxy for `implementation`, - /// and returns its address. - /// The value passed into this function will be forwarded to the proxy. - function deploy(address implementation) internal returns (address proxy) { - proxy = deployAndCall(implementation, _emptyData()); - } - - /// @dev Deploys a proxy for `implementation`, - /// and returns its address. - /// The value passed into this function will be forwarded to the proxy. - /// Then, calls the proxy with abi encoded `data`. - function deployAndCall(address implementation, bytes calldata data) internal returns (address proxy) { - proxy = _deploy(implementation, bytes32(0), false, data); - } - - /// @dev Deploys a proxy for `implementation`, with `salt`, - /// and returns its deterministic address. - /// The value passed into this function will be forwarded to the proxy. - function deployDeterministic(address implementation, bytes32 salt) internal returns (address proxy) { - proxy = deployDeterministicAndCall(implementation, salt, _emptyData()); - } - /// @dev Deploys a proxy for `implementation`, with `salt`, /// and returns its deterministic address. /// The value passed into this function will be forwarded to the proxy. @@ -83,53 +60,49 @@ contract AdminLessERC1967Factory { revert(0x1c, 0x04) } } - proxy = _deploy(implementation, salt, true, data); + proxy = _deploy(implementation, salt, data); } /// @dev Deploys the proxy, with optionality to deploy deterministically with a `salt`. - function _deploy(address implementation, bytes32 salt, bool useSalt, bytes calldata data) - internal - returns (address proxy) - { + function _deploy(address implementation, bytes32 salt, bytes calldata data) internal returns (address proxy) { bytes memory m = _initCode(); /// @solidity memory-safe-assembly assembly { - // Create the proxy. - switch useSalt - case 0 { proxy := create(0, add(m, 0x13), 0x89) } - default { proxy := create2(0, add(m, 0x13), 0x89, salt) } - } - - if (proxy == address(0)) { - proxy = predictDeterministicAddress(salt); - assembly { - if iszero(extcodesize(proxy)) { + let hash := keccak256(add(m, 0x13), 0x89) + // Compute and store the bytecode hash. + mstore8(0x00, 0xff) // Write the prefix. + mstore(0x35, hash) + mstore(0x01, shl(96, address())) + mstore(0x15, salt) + proxy := keccak256(0x00, 0x55) + // Restore the part of the free memory pointer that has been overwritten. + mstore(0x35, 0) + if iszero(extcodesize(proxy)) { + proxy := create2(0, add(m, 0x13), 0x89, salt) + if iszero(proxy) { // Revert if the creation fails. mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) revert(0x1c, 0x04) } - } - return proxy; - } - assembly { - // Set up the calldata to set the implementation of the proxy. - mstore(m, implementation) - mstore(add(m, 0x20), _IMPLEMENTATION_SLOT) - calldatacopy(add(m, 0x40), data.offset, data.length) - // Try setting the implementation on the proxy and revert upon failure. - if iszero(call(gas(), proxy, callvalue(), m, add(0x40, data.length), 0x00, 0x00)) { - // Revert with the `DeploymentFailed` selector if there is no error returndata. - if iszero(returndatasize()) { - mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) - revert(0x1c, 0x04) + // Set up the calldata to set the implementation of the proxy. + mstore(m, implementation) + mstore(add(m, 0x20), _IMPLEMENTATION_SLOT) + calldatacopy(add(m, 0x40), data.offset, data.length) + // Try setting the implementation on the proxy and revert upon failure. + if iszero(call(gas(), proxy, callvalue(), m, add(0x40, data.length), 0x00, 0x00)) { + // Revert with the `DeploymentFailed` selector if there is no error returndata. + if iszero(returndatasize()) { + mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) + revert(0x1c, 0x04) + } + // Otherwise, bubble up the returned error. + returndatacopy(0x00, 0x00, returndatasize()) + revert(0x00, returndatasize()) } - // Otherwise, bubble up the returned error. - returndatacopy(0x00, 0x00, returndatasize()) - revert(0x00, returndatasize()) - } - // Emit the {Deployed} event. - log3(0, 0, _DEPLOYED_EVENT_SIGNATURE, proxy, implementation) + // Emit the {Deployed} event. + log3(0, 0, _DEPLOYED_EVENT_SIGNATURE, proxy, implementation) + } } } diff --git a/test/foundry/Kernel.t.sol b/test/foundry/Kernel.t.sol index a28d04ad..52fedb2c 100644 --- a/test/foundry/Kernel.t.sol +++ b/test/foundry/Kernel.t.sol @@ -24,11 +24,10 @@ contract KernelTest is KernelTestBase { } function test_should_return_address_if_deployed() external { + console.log("Kernel", address(kernel)); address proxy = factory.createAccount( address(kernelImpl), - abi.encodeWithSelector( - KernelStorage.initialize.selector, defaultValidator, abi.encodePacked(owner) - ), + abi.encodeWithSelector(KernelStorage.initialize.selector, defaultValidator, abi.encodePacked(owner)), 0 ); assertEq(proxy, address(kernel)); From 51b7f6e499f28982190d563a2feec0cb2d266866 Mon Sep 17 00:00:00 2001 From: taek Date: Fri, 18 Aug 2023 01:16:20 +0900 Subject: [PATCH 15/33] Deploy/v2.1 (#29) * deploy kernel/sessionkey on mumbai * fix:check proxy deployment first and try deploy * deployed new factory * deployed on mumbai, goerli * deployed to testnets * seprate stake * deployed to polygon * deployed and staked on mainnets * deployed on bsc --- .../56/run-1692288632.json | 33 +++++ .../56/run-1692288638.json | 48 ++++++ .../56/run-latest.json | 48 ++++++ .../DeployKernel.s.sol/56/run-1692288588.json | 76 ++++++++++ .../DeployKernel.s.sol/56/run-1692288594.json | 137 ++++++++++++++++++ .../DeployKernel.s.sol/56/run-latest.json | 137 ++++++++++++++++++ .../56/run-1692288791.json | 33 +++++ .../56/run-1692288798.json | 48 ++++++ .../DeploySessionKey.s.sol/56/run-latest.json | 48 ++++++ .../56/run-1692288834.json | 33 +++++ .../56/run-1692288841.json | 63 ++++++++ .../StakeToFactory.s.sol/56/run-latest.json | 63 ++++++++ scripts/StakeToFactory.s.sol | 4 +- 13 files changed, 769 insertions(+), 2 deletions(-) create mode 100644 broadcast/DeployECDSAValidator.s.sol/56/run-1692288632.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/56/run-1692288638.json create mode 100644 broadcast/DeployECDSAValidator.s.sol/56/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/56/run-1692288588.json create mode 100644 broadcast/DeployKernel.s.sol/56/run-1692288594.json create mode 100644 broadcast/DeployKernel.s.sol/56/run-latest.json create mode 100644 broadcast/DeploySessionKey.s.sol/56/run-1692288791.json create mode 100644 broadcast/DeploySessionKey.s.sol/56/run-1692288798.json create mode 100644 broadcast/DeploySessionKey.s.sol/56/run-latest.json create mode 100644 broadcast/StakeToFactory.s.sol/56/run-1692288834.json create mode 100644 broadcast/StakeToFactory.s.sol/56/run-1692288841.json create mode 100644 broadcast/StakeToFactory.s.sol/56/run-latest.json diff --git a/broadcast/DeployECDSAValidator.s.sol/56/run-1692288632.json b/broadcast/DeployECDSAValidator.s.sol/56/run-1692288632.json new file mode 100644 index 00000000..3d27f335 --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/56/run-1692288632.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xb42d04182ab19cef86f0aa91501a5ba55b4d248bbb80940c814948becf3d6143", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xb42d04182ab19cef86f0aa91501a5ba55b4d248bbb80940c814948becf3d6143" + ], + "returns": {}, + "timestamp": 1692288632, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/56/run-1692288638.json b/broadcast/DeployECDSAValidator.s.sol/56/run-1692288638.json new file mode 100644 index 00000000..33da989e --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/56/run-1692288638.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xb42d04182ab19cef86f0aa91501a5ba55b4d248bbb80940c814948becf3d6143", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb42d04182ab19cef86f0aa91501a5ba55b4d248bbb80940c814948becf3d6143", + "transactionIndex": "0x17", + "blockHash": "0x843ddf34b52be968ec97feb6517133bf7fa04219b4f2418e15f37a05ef63cdf4", + "blockNumber": "0x1d80c7a", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2a8c91", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288638, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeployECDSAValidator.s.sol/56/run-latest.json b/broadcast/DeployECDSAValidator.s.sol/56/run-latest.json new file mode 100644 index 00000000..33da989e --- /dev/null +++ b/broadcast/DeployECDSAValidator.s.sol/56/run-latest.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0xb42d04182ab19cef86f0aa91501a5ba55b4d248bbb80940c814948becf3d6143", + "transactionType": "CREATE2", + "contractName": "ECDSAValidator", + "contractAddress": "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6e303", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056", + "nonce": "0x3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb42d04182ab19cef86f0aa91501a5ba55b4d248bbb80940c814948becf3d6143", + "transactionIndex": "0x17", + "blockHash": "0x843ddf34b52be968ec97feb6517133bf7fa04219b4f2418e15f37a05ef63cdf4", + "blockNumber": "0x1d80c7a", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2a8c91", + "gasUsed": "0x4fc64", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288638, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/56/run-1692288588.json b/broadcast/DeployKernel.s.sol/56/run-1692288588.json new file mode 100644 index 00000000..4a66421d --- /dev/null +++ b/broadcast/DeployKernel.s.sol/56/run-1692288588.json @@ -0,0 +1,76 @@ +{ + "transactions": [ + { + "hash": "0x8d051f84b2a014b6c54fc68d4b710b0c817bdf03898f224f478877bc497a7b4c", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5c4ae56fd8be2b7f3e581f8081d41da774f534152d0adb205a7999dd6c0e6e62", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x8d051f84b2a014b6c54fc68d4b710b0c817bdf03898f224f478877bc497a7b4c", + "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "0x5c4ae56fd8be2b7f3e581f8081d41da774f534152d0adb205a7999dd6c0e6e62" + ], + "returns": {}, + "timestamp": 1692288588, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/56/run-1692288594.json b/broadcast/DeployKernel.s.sol/56/run-1692288594.json new file mode 100644 index 00000000..99e55638 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/56/run-1692288594.json @@ -0,0 +1,137 @@ +{ + "transactions": [ + { + "hash": "0x8d051f84b2a014b6c54fc68d4b710b0c817bdf03898f224f478877bc497a7b4c", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5c4ae56fd8be2b7f3e581f8081d41da774f534152d0adb205a7999dd6c0e6e62", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x8d051f84b2a014b6c54fc68d4b710b0c817bdf03898f224f478877bc497a7b4c", + "transactionIndex": "0x1b", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2b9ba3", + "gasUsed": "0x1a4a41", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + }, + { + "transactionHash": "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "transactionIndex": "0x1d", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x369702", + "gasUsed": "0xa4b13", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "transactionHash": "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "transactionIndex": "0x1d", + "logIndex": "0x18", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + }, + { + "transactionHash": "0x5c4ae56fd8be2b7f3e581f8081d41da774f534152d0adb205a7999dd6c0e6e62", + "transactionIndex": "0x1e", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x37423c", + "gasUsed": "0xab3a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288594, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/56/run-latest.json b/broadcast/DeployKernel.s.sol/56/run-latest.json new file mode 100644 index 00000000..99e55638 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/56/run-latest.json @@ -0,0 +1,137 @@ +{ + "transactions": [ + { + "hash": "0x8d051f84b2a014b6c54fc68d4b710b0c817bdf03898f224f478877bc497a7b4c", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x24572d", + "value": "0x0", + "data": "0x000000000000000000000000000000000000000000000000000000000000000061014034620001b057601f62001f9f38819003918201601f19168301916001600160401b03831184841017620001b557808492602094604052833981010312620001b057516001600160a01b0381168103620001b057306080524660a05260a062000069620001cb565b600681526005602082016512d95c9b995b60d21b815260206200008b620001cb565b838152019264302e322e3160d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611db39283620001ec8439608051836118fc015260a0518361191f015260c05183611991015260e051836119b7015251826118db01525181818161049d01528181610654015281816108ad01528181610a3801528181610b5f01528181610d5901528181610e7a01528181610f7b015281816110a501526112f50152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001b55760405256fe60806040526004361015610015575b3661108857005b60003560e01c806306fdde03146101655780630b3dc35414610160578063150b7a021461015b5780631626ba7e1461015657806329f8b174146101515780633659cfe61461014c5780633a871cdd146101475780633e1b08121461014257806351166ba01461013d578063519454471461013857806354fd4d501461013357806355b14f501461012e57806357b750471461012957806384b0196e1461012457806388e7fd061461011f578063b0d691fe1461011a578063bc197c8114610115578063d087d28814610110578063d1f578941461010b578063d5416221146101065763f23a6e610361000e57610ff6565b610f64565b610ec6565b610e47565b610db8565b610d43565b610d0e565b610c66565b610c2f565b610b49565b610af1565b6109f1565b610928565b610864565b61073a565b610630565b61042f565b61039d565b610343565b6102c4565b610290565b600091031261017557565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101a357604052565b61017a565b608081019081106001600160401b038211176101a357604052565b604081019081106001600160401b038211176101a357604052565b90601f801991011681019081106001600160401b038211176101a357604052565b6040519061020c826101a8565b565b6040519061016082018281106001600160401b038211176101a357604052565b6040519061023b826101c3565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061027c575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161025b565b34610175576000366003190112610175576102c06102ac61022e565b604051918291602083526020830190610250565b0390f35b34610175576000366003190112610175576020600080516020611d938339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361017557565b359061020c826102fa565b9181601f84011215610175578235916001600160401b038311610175576020838186019501011161017557565b346101755760803660031901126101755761035f6004356102fa565b61036a6024356102fa565b6064356001600160401b03811161017557610389903690600401610316565b5050604051630a85bd0160e11b8152602090f35b34610175576040366003190112610175576024356001600160401b038111610175576103db6103d26020923690600401610316565b906004356119ed565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361017557565b6064359065ffffffffffff8216820361017557565b6084359065ffffffffffff8216820361017557565b60c0366003190112610175576104436103ee565b60243590610450826102fa565b6044359061045d826102fa565b610465610405565b9261046e61041a565b9060a4356001600160401b0381116101755761048e903690600401610316565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610626575b6106145784926104f0610587926104db6101ff565b65ffffffffffff918216815292166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261051787611050565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b1693843b15610175576040519063064acaab60e11b825281806105b16000998a94600484016115ed565b038183895af1801561060f576105f6575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060361060992610190565b8061016a565b386105c2565b6112d5565b604051637046c88d60e01b8152600490fd5b50303314156104c6565b602036600319011261017557600435610648816102fa565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806106cc575b61061457807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561067d565b9291926001600160401b0382116101a357604051916106ff601f8201601f1916602001846101de565b829481845281830111610175578281602093846000960137010152565b9080601f8301121561017557816020610737933591016106d6565b90565b6003196060368201126101755760048035916001600160401b0390818411610175576101609084360301126101755761077161020e565b9061077d84840161030b565b8252602484013560208301526044840135818111610175576107a49084369187010161071c565b60408301526064840135818111610175576107c49084369187010161071c565b60608301526084840135608083015260a484013560a083015260c484013560c083015260e484013560e0830152610104840135610100830152610124840135818111610175576108199084369187010161071c565b610120830152610144840135908111610175576102c09361085493610841923692010161071c565b61014082015260443590602435906112e1565b6040519081529081906020820190565b34610175576020366003190112610175576004356001600160c01b0381169081900361017557604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa575b506040519081529081906020820190565b61091b915060203d8111610921575b61091381836101de565b8101906111f6565b386108e9565b503d610909565b34610175576020366003190112610175576102c061096d6109476103ee565b60006060604051610957816101a8565b8281528260208201528260408201520152611050565b6040519061097a826101a8565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261017557600435610a09816102fa565b6044356001600160401b03811161017557610a2890369060040161071c565b90606435600281101561017557337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610abb575b61061457610a7581611101565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b60008281939260208394519201905af43d82803e15610a9a573d90f35b50610acb610ac7611b20565b1590565b610a68565b60405190610add826101c3565b6005825264302e322e3160d81b6020830152565b34610175576000366003190112610175576102c06102ac610ad0565b90604060031983011261017557600435610b26816102fa565b91602435906001600160401b03821161017557610b4591600401610316565b9091565b610b5236610b0d565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c25575b6106145780600080516020611d938339815191525460501c1691610bab81611cb6565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c21578385610bff819593829463064acaab60e11b8452600484016115ed565b03925af1801561060f57610c11575080f35b80610603610c1e92610190565b80f35b8380fd5b5030331415610b88565b34610175576000366003190112610175576020600080516020611d938339815191525460e01b6040519063ffffffff60e01b168152f35b3461017557600036600319011261017557610cbc610c8261022e565b610c8a610ad0565b90604051928392600f60f81b8452610cae60209360e08587015260e0860190610250565b908482036040860152610250565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf757505050500390f35b835185528695509381019392810192600101610ce8565b34610175576000366003190112610175576020600080516020611d938339815191525465ffffffffffff60405191831c168152f35b34610175576000366003190112610175576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610175578235916001600160401b038311610175576020808501948460051b01011161017557565b346101755760a036600319011261017557610dd46004356102fa565b610ddf6024356102fa565b6001600160401b0360443581811161017557610dff903690600401610d88565b505060643581811161017557610e19903690600401610d88565b505060843590811161017557610e33903690600401610316565b505060405163bc197c8160e01b8152602090f35b3461017557600036600319011261017557604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060f576102c0916000916108fa57506040519081529081906020820190565b610ecf36610b0d565b600080516020611d9383398151915254919290916001600160a01b03919060501c8216610f5357610eff81611cb6565b1691823b1561017557610f34926000928360405180968195829463064acaab60e11b8452602060048501526024840191611589565b03925af1801561060f57610f4457005b80610603610f5192610190565b005b60405162dc149f60e41b8152600490fd5b602036600319011261017557610f786103ee565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fec575b61061457600080516020611d9383398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fab565b346101755760a0366003190112610175576110126004356102fa565b61101d6024356102fa565b6084356001600160401b0381116101755761103c903690600401610316565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109e81356001600160e01b031916611050565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110f2575b61061457818091368280378136915af43d82803e15610a9a573d90f35b506110fb611b20565b156110d5565b6002111561110b57565b634e487b7160e01b600052602160045260246000fd5b906004116101755790600490565b909291928360041161017557831161017557600401916003190190565b906024116101755760100190601490565b906058116101755760380190602090565b906024116101755760040190602090565b906038116101755760240190601490565b90600a116101755760040190600690565b9060101161017557600a0190600690565b90939293848311610175578411610175578101920390565b6001600160e01b031990358181169392600481106111e757505050565b60040360031b82901b16169150565b90816020910312610175575190565b606080825282516001600160a01b031690820152919392916040916112cb90602081015160808401528381015161124a610160918260a08701526101c0860190610250565b906112b861126a606085015193605f1994858983030160c08a0152610250565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610250565b92015190848303016101a0850152610250565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b03939260009290918391907f000000000000000000000000000000000000000000000000000000000000000087163303611529576004908135978861014481013501928060248501940135600080516020611d9383398151915254946113576113518383611121565b906111ca565b9b6001600160e01b0319808e16908161140c57505050899a9b50611386826020999a9b95949361139d9361112f565b9660501c965b858c806113fd575b505036916106d6565b6101408501526113c1604051998a9788968794633a871cdd60e01b86528501611205565b0393165af191821561060f5761073793926113dd575b50611d2c565b6113f691925060203d81116109215761091381836101de565b90386113d7565b81808092335af150858c611394565b9199509197969594939c8660e01b161615156000146114365760405163fc2f51c560e01b81528c90fd5b90899a9b91600160e09b95969798999a9b1b81146000146114d557506114776114726113518b606460209c9d0135016024868201359101611121565b611050565b60018101549099906001600160a01b031696848816156114ca575b508161139d926114a19261112f565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b16179961138c565b60501c965081611492565b9198979095509250600160e11b0361151b5761151161139d948a9361150c6113518a606460209c01350160248d8201359101611121565b6115fe565b919992969161138c565b505050505050505050600190565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061155d57505050565b60140360031b82901b16169150565b35906020811061157a575090565b6000199060200360031b1b1690565b908060209392818452848401376000828201840152601f01601f1916010190565b604090610737949281528160208201520191611589565b6001600160d01b031990358181169392600681106115de57505050565b60060360031b82901b16169150565b916020610737938181520191611589565b9061162a61161e611618611612868561114c565b9061153b565b60601c90565b6001600160a01b031690565b9361163e611638858461115d565b9061156c565b60588301607882019461165961163887856058018a896111b2565b9661176261166a611638838961116e565b61167a611618611612858b61117f565b996117086116893689896106d6565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768185019081526001600160e01b03198b169282019290925260608101969096526001600160a01b039e909e16608086015260a08086019190915284529b8c9361170060c0826101de565b5190206118d9565b600080516020611d9383398151915254909190611744906117349060501c6001600160a01b031661161e565b9189019b60788d0190878d6111b2565b60405163199ed7c960e11b81529586948593849391600485016115aa565b03915afa92831561060f576114726117a861186895610517946000916118bc575b506117a1611791878d61116e565b6001600160a01b0319929161156c565b1690611d2c565b9a898b016078019a85036077190199611858906118486117e86117dd6117d76117d18b86611190565b906115c1565b60d01c90565b65ffffffffffff1690565b9761181f61161e6116186116126118086117dd6117d76117d1888b6111a1565b94611819611618611612838b61117f565b9761114c565b9461183961182b6101ff565b65ffffffffffff909b168b52565b89019065ffffffffffff169052565b6001600160a01b03166040870152565b6001600160a01b03166060850152565b6001600160a01b03871691823b156101755761189e926000928360405180968195829463064acaab60e11b8452600484016115ed565b03925af1801561060f576118af5750565b8061060361020c92610190565b6118d391508d803d106109215761091381836101de565b38611783565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611966575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611947565b600080516020611d9383398151915254611a3a93602093909291611a1c9060501c6001600160a01b031661161e565b916040519586948593849363199ed7c960e11b8552600485016115aa565b03915afa801561060f57611a5691600091611ab1575b50611d03565b9165ffffffffffff908142911611611aa15742911610611a94576001600160a01b0316611a8857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b611ac9915060203d81116109215761091381836101de565b38611a50565b90816020910312610175575180151581036101755790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b600080516020611d9383398151915254611b459060501c6001600160a01b031661161e565b6040519081639ea9bd5960e01b9182825260209384918180611b6b363360048401611ae7565b03915afa90811561060f57600091611c99575b50611c9257611b986000356001600160e01b031916611050565b6001810154909190611bb2906001600160a01b031661161e565b916001600160a01b03831615908115611c56575b8115611c32575b5015611bdb57505050600090565b829060405192839182528180611bf5363360048401611ae7565b03915afa91821561060f57600092611c0c57505090565b6107379250803d10611c2b575b611c2381836101de565b810190611acf565b503d611c19565b54611c45915065ffffffffffff166117dd565b65ffffffffffff4291161138611bcd565b905065ffffffffffff611c766117dd835465ffffffffffff9060301c1690565b168015159081611c88575b5090611bc6565b9050421138611c81565b5050600190565b611cb09150833d8511611c2b57611c2381836101de565b38611b7e565b600080516020611d9383398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c16928315600114611d24575b5060d01c92565b925038611d1d565b8082186001600160a01b031615600114611d47575050600190565b65ffffffffffff60a01b828116828216818118918111919091028082189465ffffffffffff60a01b199485169416929114611d8a575b5081811190821802181790565b925038611d7d56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xf2137", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5c4ae56fd8be2b7f3e581f8081d41da774f534152d0adb205a7999dd6c0e6e62", + "transactionType": "CALL", + "contractName": "KernelFactory", + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": "setImplementation(address,bool)", + "arguments": [ + "0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb", + "true" + ], + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x10945", + "value": "0x0", + "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x8d051f84b2a014b6c54fc68d4b710b0c817bdf03898f224f478877bc497a7b4c", + "transactionIndex": "0x1b", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2b9ba3", + "gasUsed": "0x1a4a41", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + }, + { + "transactionHash": "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "transactionIndex": "0x1d", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x369702", + "gasUsed": "0xa4b13", + "contractAddress": null, + "logs": [ + { + "address": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + ], + "data": "0x", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "transactionHash": "0x19fc1d73a3004662eb966a982efe09f8bf22a6efdf3348b2e62f5f4b32858070", + "transactionIndex": "0x1d", + "logIndex": "0x18", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000200000000020000000000000000000800000000000000000000000000000000400000000000000000000000000080000000000000000000000000080000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + }, + { + "transactionHash": "0x5c4ae56fd8be2b7f3e581f8081d41da774f534152d0adb205a7999dd6c0e6e62", + "transactionIndex": "0x1e", + "blockHash": "0x6dffb4b08a46c0665bb019818a8843a735781c0b6db7174132d1fab47b4b608a", + "blockNumber": "0x1d80c6b", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0x37423c", + "gasUsed": "0xab3a", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288594, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/56/run-1692288791.json b/broadcast/DeploySessionKey.s.sol/56/run-1692288791.json new file mode 100644 index 00000000..4c0e5e00 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/56/run-1692288791.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x8981f3e21650e450d235343aff67e2ba64b57b6208ae7c76fc42b94c574ea05b", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x8981f3e21650e450d235343aff67e2ba64b57b6208ae7c76fc42b94c574ea05b" + ], + "returns": {}, + "timestamp": 1692288791, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/56/run-1692288798.json b/broadcast/DeploySessionKey.s.sol/56/run-1692288798.json new file mode 100644 index 00000000..3eeeeba9 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/56/run-1692288798.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0x8981f3e21650e450d235343aff67e2ba64b57b6208ae7c76fc42b94c574ea05b", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x8981f3e21650e450d235343aff67e2ba64b57b6208ae7c76fc42b94c574ea05b", + "transactionIndex": "0xa", + "blockHash": "0x775da3d880bd487bef761000ad6b1f669e3346ab139de9060bdcfcfae46ee6ae", + "blockNumber": "0x1d80cae", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1859cf", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288798, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/DeploySessionKey.s.sol/56/run-latest.json b/broadcast/DeploySessionKey.s.sol/56/run-latest.json new file mode 100644 index 00000000..3eeeeba9 --- /dev/null +++ b/broadcast/DeploySessionKey.s.sol/56/run-latest.json @@ -0,0 +1,48 @@ +{ + "transactions": [ + { + "hash": "0x8981f3e21650e450d235343aff67e2ba64b57b6208ae7c76fc42b94c574ea05b", + "transactionType": "CREATE2", + "contractName": "ExecuteSessionKeyValidator", + "contractAddress": "0x1C1D5b70aD6e0c04366aab100261A6Bcc251EA3f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x1522c3", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006080806040523461001657611020908161001c8239f35b600080fdfe60c060408181526004908136101561001657600080fd5b600092833560e01c9081630c9595561461020c57508063333daf92146101de5780633a871cdd1461019557806352721fdd146101085780638fc925aa146100ab57639ea9bd591461006657600080fd5b346100a3573660031901126100a75761007d61033f565b506024356001600160401b0381116100a35761009c925036910161030d565b5050610fcf565b8280fd5b5080fd5b509060203660031901126100a3578035906001600160401b038211610104576100d69136910161030d565b6014929192116100a3576002913560601c83528260205280832033845260205282200160ff19815416905580f35b8380fd5b8382346100a757806003193601126100a75761012261033f565b6001600160a01b036024358181169290839003610191579160a09491849316825281602052828220908252602052209081549160ff600260018301549201541691805193845265ffffffffffff80831660208601528260301c169084015260601c606083015215156080820152f35b8480fd5b50600319836060368301126101db578335916001600160401b0383116100a7576101609083360301126101db57506020926101d491602435910161047d565b9051908152f35b80fd5b50346100a3573660031901126100a7576024356001600160401b0381116100a35761009c925036910161030d565b9290506020366003190112610104578035906001600160401b038211610191576102389136910161030d565b8060149492941161019157806034116101915780603a1161019157808311610191576054116101045760029161026d8261038a565b6014840135825260208201603485013560d01c81526bffffffffffff00000000000065ffffffffffff83850192603a88013560d01c845260608601948089013560601c8652608087019860018a523560601c8a5289602052808a20338b526020528920955186555116915160301b16916bffffffffffffffffffffffff19905160601b169117176001820155019051151560ff8019835416911617905580f35b9181601f8401121561033a578235916001600160401b03831161033a576020838186019501011161033a57565b600080fd5b600435906001600160a01b038216820361033a57565b9093929384831161033a57841161033a578101920390565b35906020811061037b575090565b6000199060200360031b1b1690565b60a081019081106001600160401b038211176103a557604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103a557604052565b903590601e198136030182121561033a57018035906001600160401b03821161033a5760200191813603831361033a57565b6001600160401b0381116103a55760051b60200190565b1561042c57565b60405162461bcd60e51b815260206004820152602360248201527f53657373696f6e4b657956616c696461746f723a20706172616d206d69736d616044820152620e8c6d60eb1b6064820152608490fd5b9161014083019161048e83856103dc565b60149291921161033a576104a284866103dc565b60559391931161033a57803560601c600052600060205260406000203360005260205260406000209560ff60028801541615610f75578654968715610f455760010154958660601c60018114600014610ebc57506105046101208301836103dc565b905015610e6857610516905b826103dc565b8060a099929952886080528060551161033a5760406054198a83810103011261033a576001600160401b0360558a01351161033a5760a0906054199060558b01358b01908b0103011261033a5760405161056f8161038a565b60805160558a81013590910101356001600160a01b038116810361033a5781526080805160558b0135908101607501356020840152905101609501356001600160e01b03198116810361033a576040820152608051966001600160401b0360b560558c01358a0101351161033a5760a051880160558b0135890160b581013501607401121561033a5761061060558b8101358a0160b581013501013561040e565b9861061e6040519a8b6103bb565b60558b8101358a810160b581013590810190920135808d5260a05160805160208f019f949093918401918401016060909202919091016075011161033a576055820135908101908b0160b50135016075019b5b608051605583810135808301908e0160b5810135918201910190910135606002016075018e1015610701578d60609160a05101031261033a576040518060608101106001600160401b036060830111176103a557600660208f60608401604052803584520135101561033a576060916020918f8084604092013585840152013560408201528152019c019b610671565b50509093969960559295989b5060d59396995060608701520135608051010135600281101561033a576080840152608051966001600160401b0360758901351161033a5760a0518801607460758a01358a0101121561033a5761076d605560758a01358a01013561040e565b9661077b60405198896103bb565b605560758a01358a010135885260208801998a9760a05160805190810160758d816055818301358301013560051b910135840101011161033a57607590818d013501019b5b60758c816055818301358301013560051b9101356080510101018d10156107f1578c35815260209c8d019c016107c0565b5091939597995091939597995060018060a01b038751168015908115610e44575b5015610df35761082560608201826103dc565b60441161033a576024602089015191013511610d9c5761084860608201826103dc565b60841161033a576064013560ff166002811015610a9d576080880151906002821015610a9d5703610d475761088060608201826103dc565b60641161033a57604481013560048101106109c1576108a260608301836103dc565b6044830135602481016004909101116109c1576108d76108dd916108e893602460448701350191600460448801350191610355565b9061036d565b9260608101906103dc565b6024604484013585810182019101116109c1576024604481610914968287013501019401350191610355565b9790988860041161033a5760408801516001600160e01b03199081168b3590911603610cf85760005b60608901518051821015610ab3576020908260051b0101518051600401806004116109c157815190816004016004116109c1576024820182600401116109c1578d6108d7918e6024610990950192610355565b60208201516006811015610a9d576109d75760406109b092015114610425565b60001981146109c15760010161093d565b634e487b7160e01b600052601160045260246000fd5b60208201516006811015610a9d576001036109ff5760406109fa92015110610425565b6109b0565b60208201516006811015610a9d57600203610a225760406109fa92015111610425565b60208201516006811015610a9d57600303610a465760406109fa9201511115610425565b60208201516006811015610a9d57600403610a6a5760406109fa9201511015610425565b60208201516006811015610a9d57600514610a87575b50506109b0565b6040610a969201511415610425565b3880610a80565b634e487b7160e01b600052602160045260246000fd5b5050939750939750939790946040519060208083015260e082019060018060a01b0381511660408401526020810151606084015263ffffffff60e01b604082015116608084015260608101519160a08085015282518091526020610100850193019060005b818110610cbd57505050608001516002811015610a9d57610b4891839160c083015203601f1981018352826103bb565b602081519101209080519283610c86575b50509050149283610b97575b50505015610b915760d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b161790565b50600190565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042060405192935091608081016001600160401b038111828210176103a55760405260418152602081019236605584011161033a576000809260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1608094826014602099018a3784606185015260405198516040526040840151908160605285526060840151851a885210915114165afa50600051903d15610c7857600060605260405260018060a01b0316903560601c14388080610b65565b638baa579f6000526004601cfd5b9260051b01602001905b8251811160051b9081526020835191185260206040600020920191818310610c9057915050803880610b59565b9091938451805182526020810151906006821015610a9d57826040606092602094856001970152015160408201520195019101919091610b18565b60405162461bcd60e51b815260206004820152602160248201527f53657373696f6e4b657956616c696461746f723a20736967206d69736d6174636044820152600d60fb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b9050610e5360608301836103dc565b60241161033a576010013560601c1438610812565b60405162461bcd60e51b815260206004820152602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610ecc575b5061051690610510565b610eda6101208401846103dc565b60141161033a573560601c03610ef05738610ec2565b60405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b6001015460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617965093945050505050565b60405162461bcd60e51b815260206004820152602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a206e6f7420696d706c656d656044820152631b9d195960e21b6064820152608490fd", + "nonce": "0x4" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x8981f3e21650e450d235343aff67e2ba64b57b6208ae7c76fc42b94c574ea05b", + "transactionIndex": "0xa", + "blockHash": "0x775da3d880bd487bef761000ad6b1f669e3346ab139de9060bdcfcfae46ee6ae", + "blockNumber": "0x1d80cae", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1859cf", + "gasUsed": "0xe73ab", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288798, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/56/run-1692288834.json b/broadcast/StakeToFactory.s.sol/56/run-1692288834.json new file mode 100644 index 00000000..20beb24c --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/56/run-1692288834.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043" + ], + "returns": {}, + "timestamp": 1692288834, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/56/run-1692288841.json b/broadcast/StakeToFactory.s.sol/56/run-1692288841.json new file mode 100644 index 00000000..507dd93e --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/56/run-1692288841.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043", + "transactionIndex": "0xc", + "blockHash": "0xf9c2a0e4e3cef31aa11231bdfff9d566ce6a277037ac0f9d856042a200c83ee4", + "blockNumber": "0x1d80cbd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xa3eeb", + "gasUsed": "0x13e41", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0xf9c2a0e4e3cef31aa11231bdfff9d566ce6a277037ac0f9d856042a200c83ee4", + "blockNumber": "0x1d80cbd", + "transactionHash": "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043", + "transactionIndex": "0xc", + "logIndex": "0x10", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288841, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/broadcast/StakeToFactory.s.sol/56/run-latest.json b/broadcast/StakeToFactory.s.sol/56/run-latest.json new file mode 100644 index 00000000..507dd93e --- /dev/null +++ b/broadcast/StakeToFactory.s.sol/56/run-latest.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962e15ae3", + "gas": "0x1da96", + "value": "0xde0b6b3a7640000", + "data": "0x0396cb600000000000000000000000000000000000000000000000000000000000015180", + "nonce": "0x5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043", + "transactionIndex": "0xc", + "blockHash": "0xf9c2a0e4e3cef31aa11231bdfff9d566ce6a277037ac0f9d856042a200c83ee4", + "blockNumber": "0x1d80cbd", + "from": "0x9775137314fE595c943712B0b336327dfa80aE8A", + "to": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", + "cumulativeGasUsed": "0xa3eeb", + "gasUsed": "0x13e41", + "contractAddress": null, + "logs": [ + { + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "topics": [ + "0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01", + "0x0000000000000000000000005de4839a76cf55d0c90e2061ef4386d962e15ae3" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000015180", + "blockHash": "0xf9c2a0e4e3cef31aa11231bdfff9d566ce6a277037ac0f9d856042a200c83ee4", + "blockNumber": "0x1d80cbd", + "transactionHash": "0x09952c7adc8fd319e82be636c033e7c1256fd341599688a6b7e9870723ff0043", + "transactionIndex": "0xc", + "logIndex": "0x10", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000010000000800000000000000000000000000200000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000100000000000000000000000000000000000200000000000000000000000000", + "type": "0x0", + "effectiveGasPrice": "0x12a05f200" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1692288841, + "chain": 56, + "multi": false, + "commit": "49de4da" +} \ No newline at end of file diff --git a/scripts/StakeToFactory.s.sol b/scripts/StakeToFactory.s.sol index c2b1b180..7c5a9c64 100644 --- a/scripts/StakeToFactory.s.sol +++ b/scripts/StakeToFactory.s.sol @@ -15,8 +15,8 @@ contract StakeToFactory is Script { KernelFactory factory = KernelFactory(EXPECTED_KERNEL_FACTORY_ADDRESS); IEntryPoint entryPoint = IEntryPoint(ENTRYPOINT_0_6); IStakeManager.DepositInfo memory info = entryPoint.getDepositInfo(address(factory)); - if(info.stake < 1e16) { - factory.addStake{value: 1e16}(86400); + if(info.stake < 1e18) { + factory.addStake{value: 1e18}(86400); } vm.stopBroadcast(); } From b3919c55135905ada9fe73d54a7aefb5b8c6b602 Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 26 May 2023 04:30:28 +0900 Subject: [PATCH 16/33] added stake functionality to factory --- src/factory/ECDSAKernelFactory.sol | 0 test/foundry/Kernel.test.sol | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/factory/ECDSAKernelFactory.sol create mode 100644 test/foundry/Kernel.test.sol diff --git a/src/factory/ECDSAKernelFactory.sol b/src/factory/ECDSAKernelFactory.sol new file mode 100644 index 00000000..e69de29b diff --git a/test/foundry/Kernel.test.sol b/test/foundry/Kernel.test.sol new file mode 100644 index 00000000..e69de29b From 9c5110e58066b6ce55eeb864e743e9fe5448318e Mon Sep 17 00:00:00 2001 From: leekt Date: Sun, 28 May 2023 20:46:22 +0900 Subject: [PATCH 17/33] added stake factory to follow the storage access rule for associated storage --- src/factory/KernelTempTemplate.sol | 217 +++++++++++++++++++++++++++++ tasks/test_userOp.ts | 2 +- 2 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 src/factory/KernelTempTemplate.sol diff --git a/src/factory/KernelTempTemplate.sol b/src/factory/KernelTempTemplate.sol new file mode 100644 index 00000000..5eca4cbc --- /dev/null +++ b/src/factory/KernelTempTemplate.sol @@ -0,0 +1,217 @@ +pragma solidity ^0.8.0; + +import "account-abstraction/interfaces/IEntryPoint.sol"; +import "account-abstraction/interfaces/IAccount.sol"; +import "src/Kernel.sol"; +import "src/abstract/KernelStorage.sol"; +import "forge-std/console.sol"; +bytes32 constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; +struct TempStorage { + address newTemplate; + address validator; + bytes data; + bytes validatorData; +} + +using ECDSA for bytes32; + +contract KernelTempTemplate is EIP712, IAccount { + string public constant name = "Kernel"; + + string public constant version = "0.0.2"; + + IEntryPoint public immutable entryPoint; + + /// @dev Sets up the EIP712 and KernelStorage with the provided entry point + constructor(IEntryPoint _entryPoint) EIP712(name, version) { + entryPoint = _entryPoint; + } + + // Function to initialize the wallet kernel + function initialize(IKernelValidator _defaultValidator, address _newTemplate, bytes calldata _data) external { + WalletKernelStorage storage ws = getKernelStorage(); + require(address(ws.defaultValidator) == address(0), "account: already initialized"); + ws.defaultValidator = _defaultValidator; + // _defaultValidator.enable(_data); removed to avoid accessing external storage + getStorage().newTemplate = _newTemplate; + getStorage().data = _data; + + (bool success, ) = _callCode(address(_defaultValidator) , abi.encodeWithSelector(IKernelValidator.enable.selector, _data)); // to NOT preserve msg.sender + require(success, "account: enable failed with defaultvalidator"); + } + + function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) { + bytes32 storagePosition = bytes32(uint256(keccak256("zerodev.kernel")) - 1); + assembly { + ws.slot := storagePosition + } + } + + function getTempStorage() external view returns (address newTemplate, bytes memory data) { + TempStorage storage strg = getStorage(); + newTemplate = strg.newTemplate; + data = strg.data; + } + + function getStorage() internal view returns (TempStorage storage strg) { + assembly { + strg.slot := address() + } + } + + /// @notice Validates a user operation based on its mode + /// @dev This function will validate user operation and be called by EntryPoint + /// @param userOp The user operation to be validated + /// @param userOpHash The hash of the user operation + /// @param missingAccountFunds The funds needed to be reimbursed + /// @return validationData The data used for validation + function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) + external + returns (uint256 validationData) + { + require(msg.sender == address(entryPoint), "account: not from entryPoint"); + // mode based signature + bytes4 mode = bytes4(userOp.signature[0:4]); // mode == 00..00 use validators + // mode == 0x00000000 use sudo validator + // mode == 0x00000001 use given validator + // mode == 0x00000002 enable validator + UserOperation memory op = userOp; + IKernelValidator validator; + bytes4 sig = bytes4(userOp.callData[0:4]); + if (mode == 0x00000000) { + // sudo mode (use default validator) + op = userOp; + op.signature = userOp.signature[4:]; + validator = getKernelStorage().defaultValidator; + } else if (mode == 0x00000002) { // no plugin mode + // use given validator + // userOp.signature[4:10] = validUntil, + // userOp.signature[10:16] = validAfter, + // userOp.signature[16:36] = validator address, + validator = IKernelValidator(address(bytes20(userOp.signature[16:36]))); + bytes calldata enableData; + bytes calldata remainSig; + (validationData, enableData, remainSig) = _approveValidator(sig, userOp.signature); + (bool s, ) = _callCode(address(validator),abi.encodeWithSelector(IKernelValidator.enable.selector, enableData)); // callcode for NOT preserving msg.sender + require(s, "account: enable mode enable failed"); + op.signature = remainSig; + } else { + return SIG_VALIDATION_FAILED; + } + if (missingAccountFunds > 0) { + // we are going to assume signature is valid at this point + (bool s,) = msg.sender.call{value: missingAccountFunds}(""); + (s); + } + (, bytes memory ret) = _callCode(address(validator), abi.encodeWithSelector(IKernelValidator.validateUserOp.selector, op, userOpHash, missingAccountFunds)); + validationData = + _intersectValidationData(validationData, + abi.decode(ret, (uint256))); + + return validationData; + } + + function _approveValidator(bytes4 sig, bytes calldata signature) + internal + returns (uint256 validationData, bytes calldata enableData, bytes calldata validationSig) + { + uint256 enableDataLength = uint256(bytes32(signature[56:88])); + enableData = signature[88:88 + enableDataLength]; + uint256 enableSignatureLength = uint256(bytes32(signature[88 + enableDataLength:120 + enableDataLength])); + bytes32 enableDigest = _hashTypedDataV4( + keccak256( + abi.encode( + keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), + bytes4(sig), + uint256(bytes32(signature[4:36])), + address(bytes20(signature[36:56])), + keccak256(enableData) + ) + ) + ); + (, bytes memory ret) = _callCode(address(getKernelStorage().defaultValidator), ( + abi.encodeWithSelector(IKernelValidator.validateSignature.selector, enableDigest, signature[120 + enableDataLength:120 + enableDataLength + enableSignatureLength]) + )); + validationData = _intersectValidationData( + abi.decode(ret, (uint256)), + uint256(bytes32(signature[4:36])) & (uint256(type(uint96).max) << 160) + ); + validationSig = signature[120 + enableDataLength + enableSignatureLength:]; + getKernelStorage().execution[sig] = ExecutionDetail({ + executor: address(bytes20(signature[36:56])), + validator: IKernelValidator(address(bytes20(signature[16:36]))), + validUntil: uint48(bytes6(signature[4:10])), + validAfter: uint48(bytes6(signature[10:16])) + }); + getStorage().validator = address(bytes20(signature[16:36])); + getStorage().validatorData = enableData; + return (validationData, signature[88:88 + enableDataLength], validationSig); + } + receive() external payable { + } + + fallback() external payable { + TempStorage storage strg = getStorage(); + address _newImplementation = strg.newTemplate; + bytes32 slot = _IMPLEMENTATION_SLOT; + assembly { + sstore(slot, _newImplementation) + } // update implementation address for used on execution phase + + IKernelValidator defaultValidator = IKernelValidator(getKernelStorage().defaultValidator); + defaultValidator.enable(strg.data); + + IKernelValidator validator = IKernelValidator(getStorage().validator); + if(address(validator) != address(0)) { + validator.enable(getStorage().validatorData); + } + + (bool success, bytes memory ret) = _newImplementation.delegatecall(msg.data); + require(success, string(ret)); + } + + // WARTNING: this function is NOT VIEW + /// @notice Checks if a signature is valid + /// @dev This function checks if a signature is valid based on the hash of the data signed. + /// @param hash The hash of the data that was signed + /// @param signature The signature to be validated + /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. + function isValidSignature(bytes32 hash, bytes calldata signature) external returns (bytes4) { + (, bytes memory ret) = + _callCode(address(getKernelStorage().defaultValidator), + abi.encodeWithSelector(IKernelValidator.validateSignature.selector, hash, signature) + ); + uint256 validationData = abi.decode(ret, (uint256)); + ValidationData memory data = _parseValidationData(validationData); + if (data.validAfter > block.timestamp) { + return 0xffffffff; + } + if (data.validUntil < block.timestamp) { + return 0xffffffff; + } + if (data.aggregator != address(0)) { + return 0xffffffff; + } + + return 0x1626ba7e; + } + + + function _callCode(address _target, bytes memory data) internal returns(bool success, bytes memory ret) { + assembly { + let result := callcode(gas(), _target,0, add(data, 0x20), mload(data), 0, 0) + // Load free memory location + let ptr := mload(0x40) + // We allocate memory for the return data by setting the free memory location to + // current free memory location + data size + 32 bytes for data size value + mstore(0x40, add(ptr, add(returndatasize(), 0x20))) + // Store the size + mstore(ptr, returndatasize()) + // Store the data + returndatacopy(add(ptr, 0x20), 0, returndatasize()) + // Point the return data to the correct memory location + ret := ptr + success := result + } + } +} \ No newline at end of file diff --git a/tasks/test_userOp.ts b/tasks/test_userOp.ts index 46a1b5cc..b6148422 100644 --- a/tasks/test_userOp.ts +++ b/tasks/test_userOp.ts @@ -2,7 +2,7 @@ import { task } from "hardhat/config" import { hexConcat, arrayify, hexZeroPad } from "ethers/lib/utils" -const STACKUP = "https://api.stackup.sh/v1/node/65bdd496f420d5610b504691af2787cda9a580cd2be7d3fb64a78fc17bc65c42" +const STACKUP = "https://api.stackup.sh/v1/node/" task("test-userop-initcode", "deploy erc20 paymaster") .setAction(async (taskArgs, hre) => { From 3d62613edaf19ae7d4c839094351388f221ce6f1 Mon Sep 17 00:00:00 2001 From: leekt Date: Sun, 28 May 2023 20:49:26 +0900 Subject: [PATCH 18/33] renamed to TempKernel --- src/factory/KernelTempTemplate.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/factory/KernelTempTemplate.sol b/src/factory/KernelTempTemplate.sol index 5eca4cbc..36cff711 100644 --- a/src/factory/KernelTempTemplate.sol +++ b/src/factory/KernelTempTemplate.sol @@ -15,7 +15,7 @@ struct TempStorage { using ECDSA for bytes32; -contract KernelTempTemplate is EIP712, IAccount { +contract TempKernel is EIP712, IAccount { string public constant name = "Kernel"; string public constant version = "0.0.2"; From a87f555adb12f634b6f77786c04cab363496dd85 Mon Sep 17 00:00:00 2001 From: leekt Date: Sun, 28 May 2023 20:54:19 +0900 Subject: [PATCH 19/33] deploy script --- broadcast/DeployKernel.s.sol/80001/run-latest.json | 1 + tasks/test_userOp.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json index 963a94fb..7601a7bd 100644 --- a/broadcast/DeployKernel.s.sol/80001/run-latest.json +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -227,6 +227,7 @@ ], "libraries": [], "pending": [], + "path": "/Users/leekt/workspace/zerodevapp/zerodev-wallet-kernel/broadcast/DeployKernel.s.sol/80001/run-latest.json", "returns": {}, "timestamp": 1692067762, "chain": 80001, diff --git a/tasks/test_userOp.ts b/tasks/test_userOp.ts index b6148422..22b36ebe 100644 --- a/tasks/test_userOp.ts +++ b/tasks/test_userOp.ts @@ -58,7 +58,7 @@ task("test-userop", "test userop") const addr = await signer.getAddress(); console.log("signer address: ", addr); const entrypoint = await hre.ethers.getContractAt("EntryPoint", "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"); - const ecdsaFactory = await hre.ethers.getContractAt("ECDSAKernelFactory", "0x08e627ca6a0593c807091726a7fbb2887a1cb556"); + const ecdsaFactory = await hre.ethers.getContractAt("ECDSAKernelFactory", "0x6b337f4ddb17b4ba93bcde99661ab46aec1d2823"); const account = await ecdsaFactory.getAccountAddress(addr, kernel_id); //await ecdsaFactory.createAccount(addr, kernel_id); const kernel = await hre.ethers.getContractAt("Kernel", account); From fde62f476deb37ffdc8a774c42a0ff19aa0aef07 Mon Sep 17 00:00:00 2001 From: leekt Date: Sun, 28 May 2023 21:48:17 +0900 Subject: [PATCH 20/33] changed script a bit --- tasks/test_userOp.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/test_userOp.ts b/tasks/test_userOp.ts index 22b36ebe..25c14137 100644 --- a/tasks/test_userOp.ts +++ b/tasks/test_userOp.ts @@ -19,7 +19,7 @@ task("test-userop-initcode", "deploy erc20 paymaster") nonce : 0, initCode : hexConcat([ecdsaFactory.address, ecdsaFactory.interface.encodeFunctionData("createAccount", [addr, 3])]), callData : kernel.interface.encodeFunctionData("execute", [addr,0,"0x",0]), - callGasLimit : 100000, + callGasLimit : 33100, verificationGasLimit : 300000, preVerificationGas : 300000, maxFeePerGas: (await hre.ethers.provider.getGasPrice()).toHexString(), @@ -68,7 +68,7 @@ task("test-userop", "test userop") nonce : (await entrypoint.getNonce(account,0)).toHexString(), initCode : "0x", callData : kernel.interface.encodeFunctionData("execute", [addr,0,"0x",0]), - callGasLimit : 100000, + callGasLimit : 33100, verificationGasLimit : 300000, preVerificationGas : 45100, maxFeePerGas: (await hre.ethers.provider.getGasPrice()).toHexString(), From 2c3b208df4e3532f9c44f1a710779cfd3e46ff8a Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 29 May 2023 02:42:03 +0900 Subject: [PATCH 21/33] renamed to TempKernel --- src/Kernel.sol | 2 +- src/factory/{KernelTempTemplate.sol => TempKernel.sol} | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) rename src/factory/{KernelTempTemplate.sol => TempKernel.sol} (99%) diff --git a/src/Kernel.sol b/src/Kernel.sol index 0d4fdfd2..29496acd 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -41,7 +41,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { } assembly { calldatacopy(0, 0, calldatasize()) - let result := delegatecall(gas(), executor, 0, calldatasize(), 0, 0) + let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 { revert(0, returndatasize()) } diff --git a/src/factory/KernelTempTemplate.sol b/src/factory/TempKernel.sol similarity index 99% rename from src/factory/KernelTempTemplate.sol rename to src/factory/TempKernel.sol index 36cff711..f5c04bbc 100644 --- a/src/factory/KernelTempTemplate.sol +++ b/src/factory/TempKernel.sol @@ -213,5 +213,6 @@ contract TempKernel is EIP712, IAccount { ret := ptr success := result } + require(success, string(ret)); } } \ No newline at end of file From 63888ff548fd3c38148eb45785ae718bdf2f139e Mon Sep 17 00:00:00 2001 From: leekt Date: Tue, 30 May 2023 00:47:43 +0900 Subject: [PATCH 22/33] forge fmt --- src/Kernel.sol | 2 +- src/factory/TempKernel.sol | 55 ++++++++++++--------- src/validator/ERC165SessionKeyValidator.sol | 2 +- test/foundry/KernelExecution.t.sol | 34 +++++++------ 4 files changed, 53 insertions(+), 40 deletions(-) diff --git a/src/Kernel.sol b/src/Kernel.sol index 29496acd..1af9cadc 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -207,7 +207,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { validator.enable(enableData); } } - + /// @notice Checks if a signature is valid /// @dev This function checks if a signature is valid based on the hash of the data signed. /// @param hash The hash of the data that was signed diff --git a/src/factory/TempKernel.sol b/src/factory/TempKernel.sol index f5c04bbc..1ef124dd 100644 --- a/src/factory/TempKernel.sol +++ b/src/factory/TempKernel.sol @@ -5,7 +5,9 @@ import "account-abstraction/interfaces/IAccount.sol"; import "src/Kernel.sol"; import "src/abstract/KernelStorage.sol"; import "forge-std/console.sol"; + bytes32 constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + struct TempStorage { address newTemplate; address validator; @@ -36,7 +38,8 @@ contract TempKernel is EIP712, IAccount { getStorage().newTemplate = _newTemplate; getStorage().data = _data; - (bool success, ) = _callCode(address(_defaultValidator) , abi.encodeWithSelector(IKernelValidator.enable.selector, _data)); // to NOT preserve msg.sender + (bool success,) = + _callCode(address(_defaultValidator), abi.encodeWithSelector(IKernelValidator.enable.selector, _data)); // to NOT preserve msg.sender require(success, "account: enable failed with defaultvalidator"); } @@ -83,7 +86,8 @@ contract TempKernel is EIP712, IAccount { op = userOp; op.signature = userOp.signature[4:]; validator = getKernelStorage().defaultValidator; - } else if (mode == 0x00000002) { // no plugin mode + } else if (mode == 0x00000002) { + // no plugin mode // use given validator // userOp.signature[4:10] = validUntil, // userOp.signature[10:16] = validAfter, @@ -92,7 +96,8 @@ contract TempKernel is EIP712, IAccount { bytes calldata enableData; bytes calldata remainSig; (validationData, enableData, remainSig) = _approveValidator(sig, userOp.signature); - (bool s, ) = _callCode(address(validator),abi.encodeWithSelector(IKernelValidator.enable.selector, enableData)); // callcode for NOT preserving msg.sender + (bool s,) = + _callCode(address(validator), abi.encodeWithSelector(IKernelValidator.enable.selector, enableData)); // callcode for NOT preserving msg.sender require(s, "account: enable mode enable failed"); op.signature = remainSig; } else { @@ -103,10 +108,11 @@ contract TempKernel is EIP712, IAccount { (bool s,) = msg.sender.call{value: missingAccountFunds}(""); (s); } - (, bytes memory ret) = _callCode(address(validator), abi.encodeWithSelector(IKernelValidator.validateUserOp.selector, op, userOpHash, missingAccountFunds)); - validationData = - _intersectValidationData(validationData, - abi.decode(ret, (uint256))); + (, bytes memory ret) = _callCode( + address(validator), + abi.encodeWithSelector(IKernelValidator.validateUserOp.selector, op, userOpHash, missingAccountFunds) + ); + validationData = _intersectValidationData(validationData, abi.decode(ret, (uint256))); return validationData; } @@ -129,12 +135,18 @@ contract TempKernel is EIP712, IAccount { ) ) ); - (, bytes memory ret) = _callCode(address(getKernelStorage().defaultValidator), ( - abi.encodeWithSelector(IKernelValidator.validateSignature.selector, enableDigest, signature[120 + enableDataLength:120 + enableDataLength + enableSignatureLength]) - )); + (, bytes memory ret) = _callCode( + address(getKernelStorage().defaultValidator), + ( + abi.encodeWithSelector( + IKernelValidator.validateSignature.selector, + enableDigest, + signature[120 + enableDataLength:120 + enableDataLength + enableSignatureLength] + ) + ) + ); validationData = _intersectValidationData( - abi.decode(ret, (uint256)), - uint256(bytes32(signature[4:36])) & (uint256(type(uint96).max) << 160) + abi.decode(ret, (uint256)), uint256(bytes32(signature[4:36])) & (uint256(type(uint96).max) << 160) ); validationSig = signature[120 + enableDataLength + enableSignatureLength:]; getKernelStorage().execution[sig] = ExecutionDetail({ @@ -147,8 +159,8 @@ contract TempKernel is EIP712, IAccount { getStorage().validatorData = enableData; return (validationData, signature[88:88 + enableDataLength], validationSig); } - receive() external payable { - } + + receive() external payable {} fallback() external payable { TempStorage storage strg = getStorage(); @@ -162,7 +174,7 @@ contract TempKernel is EIP712, IAccount { defaultValidator.enable(strg.data); IKernelValidator validator = IKernelValidator(getStorage().validator); - if(address(validator) != address(0)) { + if (address(validator) != address(0)) { validator.enable(getStorage().validatorData); } @@ -177,10 +189,10 @@ contract TempKernel is EIP712, IAccount { /// @param signature The signature to be validated /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. function isValidSignature(bytes32 hash, bytes calldata signature) external returns (bytes4) { - (, bytes memory ret) = - _callCode(address(getKernelStorage().defaultValidator), + (, bytes memory ret) = _callCode( + address(getKernelStorage().defaultValidator), abi.encodeWithSelector(IKernelValidator.validateSignature.selector, hash, signature) - ); + ); uint256 validationData = abi.decode(ret, (uint256)); ValidationData memory data = _parseValidationData(validationData); if (data.validAfter > block.timestamp) { @@ -196,10 +208,9 @@ contract TempKernel is EIP712, IAccount { return 0x1626ba7e; } - - function _callCode(address _target, bytes memory data) internal returns(bool success, bytes memory ret) { + function _callCode(address _target, bytes memory data) internal returns (bool success, bytes memory ret) { assembly { - let result := callcode(gas(), _target,0, add(data, 0x20), mload(data), 0, 0) + let result := callcode(gas(), _target, 0, add(data, 0x20), mload(data), 0, 0) // Load free memory location let ptr := mload(0x40) // We allocate memory for the return data by setting the free memory location to @@ -215,4 +226,4 @@ contract TempKernel is EIP712, IAccount { } require(success, string(ret)); } -} \ No newline at end of file +} diff --git a/src/validator/ERC165SessionKeyValidator.sol b/src/validator/ERC165SessionKeyValidator.sol index d0071274..c99942a8 100644 --- a/src/validator/ERC165SessionKeyValidator.sol +++ b/src/validator/ERC165SessionKeyValidator.sol @@ -53,7 +53,7 @@ contract ERC165SessionKeyValidator is IKernelValidator { return SIG_VALIDATION_FAILED; } require(bytes4(_userOp.callData[0:4]) == sessionKey.selector, "not supported selector"); - address token = address(bytes20(_userOp.callData[sessionKey.addressOffset:sessionKey.addressOffset + 20])); + address token = address(bytes20(_userOp.callData[sessionKey.addressOffset:sessionKey.addressOffset+20])); require(IERC165(token).supportsInterface(sessionKey.interfaceId), "does not support interface"); return packValidationData(sessionKey.validAfter, sessionKey.validUntil); } diff --git a/test/foundry/KernelExecution.t.sol b/test/foundry/KernelExecution.t.sol index 21c87dea..504be1bd 100644 --- a/test/foundry/KernelExecution.t.sol +++ b/test/foundry/KernelExecution.t.sol @@ -29,8 +29,7 @@ contract KernelExecutionTest is KernelTestBase { vm.warp(1000); bytes memory empty; UserOperation memory op = entryPoint.fillUserOp( - address(kernel), - abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) + address(kernel), abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) ); op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); UserOperation[] memory ops = new UserOperation[](1); @@ -161,22 +160,25 @@ contract KernelExecutionTest is KernelTestBase { ); (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); - op.signature = abi.encodePacked( - bytes4(0x00000002), - uint48(0), - uint48(0), - address(sessionKeyValidator), - address(action), - uint256(enableData.length), - enableData, - uint256(65), - r, - s, - v - ); + op.signature = abi.encodePacked( + bytes4(0x00000002), + uint48(0), + uint48(0), + address(sessionKeyValidator), + address(action), + uint256(enableData.length), + enableData, + uint256(65), + r, + s, + v + ); } - op.signature = bytes.concat(op.signature, entryPoint.signUserOpHash(vm, sessionKeyPriv, op)); + op.signature = bytes.concat( + op.signature, + entryPoint.signUserOpHash(vm, sessionKeyPriv, op) + ); UserOperation[] memory ops = new UserOperation[](1); ops[0] = op; From dd2e8ced79746a664e3d379a38fdfab46da69d6c Mon Sep 17 00:00:00 2001 From: leekt Date: Tue, 30 May 2023 00:49:59 +0900 Subject: [PATCH 23/33] removed console.sol --- src/factory/TempKernel.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/factory/TempKernel.sol b/src/factory/TempKernel.sol index 1ef124dd..e2fe92d1 100644 --- a/src/factory/TempKernel.sol +++ b/src/factory/TempKernel.sol @@ -4,7 +4,6 @@ import "account-abstraction/interfaces/IEntryPoint.sol"; import "account-abstraction/interfaces/IAccount.sol"; import "src/Kernel.sol"; import "src/abstract/KernelStorage.sol"; -import "forge-std/console.sol"; bytes32 constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; From 8ee174c2310be25daa6cd3f79a44965902df4faf Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 31 May 2023 04:04:01 +0900 Subject: [PATCH 24/33] removed staker and renamed actions to executor --- src/executor/ERC721Actions.sol | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/executor/ERC721Actions.sol diff --git a/src/executor/ERC721Actions.sol b/src/executor/ERC721Actions.sol new file mode 100644 index 00000000..e69de29b From 1bc310409a943e2548c5b91abf579edacd219484 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 1 Jun 2023 02:35:11 +0900 Subject: [PATCH 25/33] deployed with deterministic deployment --- broadcast/DeployKernel.s.sol/80001/run-latest.json | 4 +++- scripts/DeployKernel.s.sol | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json index 7601a7bd..0cbd7785 100644 --- a/broadcast/DeployKernel.s.sol/80001/run-latest.json +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -6,7 +6,9 @@ "contractName": "KernelFactory", "contractAddress": "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", "function": null, - "arguments": null, + "arguments": [ + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + ], "transaction": { "type": "0x00", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", diff --git a/scripts/DeployKernel.s.sol b/scripts/DeployKernel.s.sol index b4f11ee5..5742e405 100644 --- a/scripts/DeployKernel.s.sol +++ b/scripts/DeployKernel.s.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.0; import "src/factory/KernelFactory.sol"; import "account-abstraction/interfaces/IStakeManager.sol"; import "forge-std/Script.sol"; -import "forge-std/console.sol"; contract DeployKernel is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; From 4e7b5461cb8510e1b800e7c3946cfc38ebe22c98 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 1 Jun 2023 14:04:01 +0900 Subject: [PATCH 26/33] script done for session key --- broadcast/DeployKernel.s.sol/80001/run-latest.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json index 0cbd7785..05f5b13b 100644 --- a/broadcast/DeployKernel.s.sol/80001/run-latest.json +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -40,7 +40,13 @@ "data": "0xbb30a974000000000000000000000000f048ad83cb2dfd6037a43902a2a5be04e53cd2eb0000000000000000000000000000000000000000000000000000000000000001", "nonce": "0xeb" }, - "additionalContracts": [], + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x180D6465F921C7E0DEA0040107D342c87455fFF5", + "initCode": "608060405234801561001057600080fd5b50610863806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630c9595561461005c57806320709efc14610071578063333daf92146100b75780633a871cdd146100d85780638fc925aa146100eb575b600080fd5b61006f61006a36600461069c565b61011a565b005b61009a61007f3660046106de565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca6100c5366004610707565b61019a565b6040519081526020016100ae565b6100ca6100e6366004610753565b610297565b61006f6100f936600461069c565b505033600090815260208190526040902080546001600160a01b0319169055565b600061012960148284866107a7565b610132916107d1565b3360008181526020819052604080822080546001600160a01b0319811660609690961c95861790915590519394506001600160a01b0316928492849290917f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053319190a450505050565b33600090815260208181526040808320548151601f86018490048402810184019092528482526001600160a01b0316916101f0918791879087908190840183828082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610212576000915050610290565b600061021d866103ac565b905060006102618287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b9050806001600160a01b0316836001600160a01b0316146102885760019350505050610290565b600093505050505b9392505050565b60008080806102a960208801886106de565b6001600160a01b039081168252602082019290925260400160002054169050610314846102da610140880188610806565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061038892505050565b6001600160a01b0316816001600160a01b031603610336576000915050610290565b6000610341856103ac565b90506000610357826102da6101408a018a610806565b9050806001600160a01b0316836001600160a01b03161461037e5760019350505050610290565b5050509392505050565b600080600061039785856103ff565b915091506103a481610444565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008082516041036104355760208301516040840151606085015160001a61042987828585610596565b9450945050505061043d565b506000905060025b9250929050565b60008160048111156104585761045861084d565b036104605750565b60018160048111156104745761047461084d565b036104c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b60028160048111156104da576104da61084d565b036105275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104bd565b600381600481111561053b5761053b61084d565b036105935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104bd565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156105cd5750600090506003610651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661064a57600060019250925050610651565b9150600090505b94509492505050565b60008083601f84011261066c57600080fd5b50813567ffffffffffffffff81111561068457600080fd5b60208301915083602082850101111561043d57600080fd5b600080602083850312156106af57600080fd5b823567ffffffffffffffff8111156106c657600080fd5b6106d28582860161065a565b90969095509350505050565b6000602082840312156106f057600080fd5b81356001600160a01b038116811461029057600080fd5b60008060006040848603121561071c57600080fd5b83359250602084013567ffffffffffffffff81111561073a57600080fd5b6107468682870161065a565b9497909650939450505050565b60008060006060848603121561076857600080fd5b833567ffffffffffffffff81111561077f57600080fd5b8401610160818703121561079257600080fd5b95602085013595506040909401359392505050565b600080858511156107b757600080fd5b838611156107c457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107fe5780818660140360031b1b83161692505b505092915050565b6000808335601e1984360301811261081d57600080fd5b83018035915067ffffffffffffffff82111561083857600080fd5b60200191503681900382131561043d57600080fd5b634e487b7160e01b600052602160045260246000fd" + } + ], "isFixedGasLimit": false }, { From a266905033b4e5e64548263b55266a07c0c5787a Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 1 Jun 2023 15:40:34 +0900 Subject: [PATCH 27/33] using simple trick to adapt the storage access rule --- src/validator/ERC165SessionKeyValidator.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validator/ERC165SessionKeyValidator.sol b/src/validator/ERC165SessionKeyValidator.sol index c99942a8..07927d05 100644 --- a/src/validator/ERC165SessionKeyValidator.sol +++ b/src/validator/ERC165SessionKeyValidator.sol @@ -9,7 +9,7 @@ import "src/common/Types.sol"; // idea, we can make this merkle root struct ERC165SessionKeyStorage { - bool enabled; + address key; bytes4 selector; bytes4 interfaceId; ValidAfter validAfter; @@ -18,7 +18,7 @@ struct ERC165SessionKeyStorage { } contract ERC165SessionKeyValidator is IKernelValidator { - mapping(address sessionKey => mapping(address kernel => ERC165SessionKeyStorage)) public sessionKeys; + mapping(address => ERC165SessionKeyStorage) public sessionKeys; function enable(bytes calldata _data) external payable { address sessionKey = address(bytes20(_data[0:20])); @@ -48,8 +48,8 @@ contract ERC165SessionKeyValidator is IKernelValidator { { bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); address recovered = ECDSA.recover(hash, _userOp.signature); - ERC165SessionKeyStorage storage sessionKey = sessionKeys[recovered][_userOp.sender]; - if (!sessionKey.enabled) { + ERC165SessionKeyStorage storage sessionKey = sessionKeys[_userOp.sender]; + if (recovered != sessionKey.key) { return SIG_VALIDATION_FAILED; } require(bytes4(_userOp.callData[0:4]) == sessionKey.selector, "not supported selector"); From 07322c0dbba883c7cadd8343272221344a22a4f2 Mon Sep 17 00:00:00 2001 From: 0xca11 <0xca11@protonmail.com> Date: Tue, 6 Jun 2023 11:08:40 +0700 Subject: [PATCH 28/33] feat: added a new SessionKeyOwnedKernelFactory --- src/factory/SessionKeyOwnedKernelFactory.sol | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/factory/SessionKeyOwnedKernelFactory.sol diff --git a/src/factory/SessionKeyOwnedKernelFactory.sol b/src/factory/SessionKeyOwnedKernelFactory.sol new file mode 100644 index 00000000..a20cb650 --- /dev/null +++ b/src/factory/SessionKeyOwnedKernelFactory.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "./KernelFactory.sol"; +import "src/validator/SessionKeyOwnedValidator.sol"; + +contract SessionKeyOwnedKernelFactory { + KernelFactory public immutable singletonFactory; + SessionKeyOwnedValidator public immutable validator; + IEntryPoint public immutable entryPoint; + + constructor(KernelFactory _singletonFactory, SessionKeyOwnedValidator _validator, IEntryPoint _entryPoint) { + singletonFactory = _singletonFactory; + validator = _validator; + entryPoint = _entryPoint; + } + + function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) { + bytes memory data = abi.encodePacked(_owner); + proxy = singletonFactory.createAccount(validator, data, _index); + } + + function getAccountAddress(address _owner, uint256 _index) public view returns (address) { + bytes memory data = abi.encodePacked(_owner); + return singletonFactory.getAccountAddress(validator, data, _index); + } +} From 61b8dfbf08caf1476fd5c53f9ce97e99d97a74ea Mon Sep 17 00:00:00 2001 From: 0xca11 <0xca11@protonmail.com> Date: Tue, 6 Jun 2023 14:46:44 +0700 Subject: [PATCH 29/33] fix: SessionKeyOwnedKernel owner data for account creation --- src/factory/SessionKeyOwnedKernelFactory.sol | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/factory/SessionKeyOwnedKernelFactory.sol b/src/factory/SessionKeyOwnedKernelFactory.sol index a20cb650..de5e6e36 100644 --- a/src/factory/SessionKeyOwnedKernelFactory.sol +++ b/src/factory/SessionKeyOwnedKernelFactory.sol @@ -16,12 +16,21 @@ contract SessionKeyOwnedKernelFactory { } function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) { - bytes memory data = abi.encodePacked(_owner); + bytes memory data = _getOwnerData(_owner); + proxy = singletonFactory.createAccount(validator, data, _index); } function getAccountAddress(address _owner, uint256 _index) public view returns (address) { - bytes memory data = abi.encodePacked(_owner); + bytes memory data = _getOwnerData(_owner); return singletonFactory.getAccountAddress(validator, data, _index); } + + function _getOwnerData(address _owner) internal pure returns (bytes memory data) { + // the owner is treated as a session key that lasts forever + uint48 validUntil = type(uint48).max; + uint48 validAfter = 0; + + data = abi.encodePacked(_owner, validUntil, validAfter); + } } From 253b57d7b3a0181ca0dceef4ad7462ce032bada5 Mon Sep 17 00:00:00 2001 From: 0xca11 <0xca11@protonmail.com> Date: Wed, 7 Jun 2023 10:54:16 +0700 Subject: [PATCH 30/33] refactor: expect digest passed to be a hashed typed data already --- src/validator/SessionKeyOwnedValidator.sol | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/validator/SessionKeyOwnedValidator.sol b/src/validator/SessionKeyOwnedValidator.sol index b985dbe6..2b5d8adb 100644 --- a/src/validator/SessionKeyOwnedValidator.sol +++ b/src/validator/SessionKeyOwnedValidator.sol @@ -51,12 +51,11 @@ contract SessionKeyOwnedValidator is IKernelValidator { validationData = packValidationData(sessionKey.validAfter, sessionKey.validUntil); } - function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (ValidationData) { - bytes32 ethhash = ECDSA.toEthSignedMessageHash(hash); - address recovered = ECDSA.recover(ethhash, signature); + function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { + address recovered = ECDSA.recover(hash, signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (ValidUntil.unwrap(sessionKey.validUntil) == 0) { + if (sessionKey.validUntil == 0) { // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } From f7d1b42f677187be86fc4a54cbc7c99669cb68e5 Mon Sep 17 00:00:00 2001 From: 0xca11 <0xca11@protonmail.com> Date: Sat, 10 Jun 2023 21:14:42 +0700 Subject: [PATCH 31/33] Revert "refactor: expect digest passed to be a hashed typed data already" This reverts commit c850e7d9e262b356c7bea5981351fad116d42114. --- src/validator/SessionKeyOwnedValidator.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/validator/SessionKeyOwnedValidator.sol b/src/validator/SessionKeyOwnedValidator.sol index 2b5d8adb..b8294c8b 100644 --- a/src/validator/SessionKeyOwnedValidator.sol +++ b/src/validator/SessionKeyOwnedValidator.sol @@ -52,11 +52,11 @@ contract SessionKeyOwnedValidator is IKernelValidator { } function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { - address recovered = ECDSA.recover(hash, signature); + bytes32 ethhash = ECDSA.toEthSignedMessageHash(hash); + address recovered = ECDSA.recover(ethhash, signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (sessionKey.validUntil == 0) { - // we do not allow validUntil == 0 here + if (sessionKey.validUntil == 0 ) { // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } return packValidationData(sessionKey.validAfter, sessionKey.validUntil); From b43c2b39ae0e6ea06c0cfda8d8d7f5e3645e058d Mon Sep 17 00:00:00 2001 From: 0xca11 <0xca11@protonmail.com> Date: Sat, 10 Jun 2023 23:21:42 +0700 Subject: [PATCH 32/33] refactor: validate signed typed data and signed eth messages --- src/validator/SessionKeyOwnedValidator.sol | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/validator/SessionKeyOwnedValidator.sol b/src/validator/SessionKeyOwnedValidator.sol index b8294c8b..23d6656d 100644 --- a/src/validator/SessionKeyOwnedValidator.sol +++ b/src/validator/SessionKeyOwnedValidator.sol @@ -52,10 +52,16 @@ contract SessionKeyOwnedValidator is IKernelValidator { } function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { - bytes32 ethhash = ECDSA.toEthSignedMessageHash(hash); - address recovered = ECDSA.recover(ethhash, signature); + address recovered = ECDSA.recover(hash, signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; + if (sessionKey.validUntil != 0) { + return packValidationData(sessionKey.validAfter, sessionKey.validUntil); + } + + hash = ECDSA.toEthSignedMessageHash(hash); + recovered = ECDSA.recover(hash, signature); + sessionKey = sessionKeyStorage[recovered][msg.sender]; if (sessionKey.validUntil == 0 ) { // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } From f3a091ebd0d6e93a2038ac86da31830830add5ba Mon Sep 17 00:00:00 2001 From: 0xca11 <0xca11@protonmail.com> Date: Mon, 18 Sep 2023 11:01:33 +0800 Subject: [PATCH 33/33] feat: pull and merge changes from ZeroDev's upstream v2.1 --- src/Kernel.sol | 4 +- src/executor/ERC721Actions.sol | 0 src/factory/ECDSAKernelFactory.sol | 0 src/factory/SessionKeyOwnedKernelFactory.sol | 36 --- src/factory/TempKernel.sol | 228 ------------------- src/validator/ERC165SessionKeyValidator.sol | 10 +- src/validator/SessionKeyOwnedValidator.sol | 12 +- test/foundry/Kernel.test.sol | 0 test/foundry/KernelExecution.t.sol | 34 ++- 9 files changed, 32 insertions(+), 292 deletions(-) delete mode 100644 src/executor/ERC721Actions.sol delete mode 100644 src/factory/ECDSAKernelFactory.sol delete mode 100644 src/factory/SessionKeyOwnedKernelFactory.sol delete mode 100644 src/factory/TempKernel.sol delete mode 100644 test/foundry/Kernel.test.sol diff --git a/src/Kernel.sol b/src/Kernel.sol index 1af9cadc..0d4fdfd2 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -41,7 +41,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { } assembly { calldatacopy(0, 0, calldatasize()) - let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) + let result := delegatecall(gas(), executor, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 { revert(0, returndatasize()) } @@ -207,7 +207,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { validator.enable(enableData); } } - + /// @notice Checks if a signature is valid /// @dev This function checks if a signature is valid based on the hash of the data signed. /// @param hash The hash of the data that was signed diff --git a/src/executor/ERC721Actions.sol b/src/executor/ERC721Actions.sol deleted file mode 100644 index e69de29b..00000000 diff --git a/src/factory/ECDSAKernelFactory.sol b/src/factory/ECDSAKernelFactory.sol deleted file mode 100644 index e69de29b..00000000 diff --git a/src/factory/SessionKeyOwnedKernelFactory.sol b/src/factory/SessionKeyOwnedKernelFactory.sol deleted file mode 100644 index de5e6e36..00000000 --- a/src/factory/SessionKeyOwnedKernelFactory.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.18; - -import "./KernelFactory.sol"; -import "src/validator/SessionKeyOwnedValidator.sol"; - -contract SessionKeyOwnedKernelFactory { - KernelFactory public immutable singletonFactory; - SessionKeyOwnedValidator public immutable validator; - IEntryPoint public immutable entryPoint; - - constructor(KernelFactory _singletonFactory, SessionKeyOwnedValidator _validator, IEntryPoint _entryPoint) { - singletonFactory = _singletonFactory; - validator = _validator; - entryPoint = _entryPoint; - } - - function createAccount(address _owner, uint256 _index) external returns (EIP1967Proxy proxy) { - bytes memory data = _getOwnerData(_owner); - - proxy = singletonFactory.createAccount(validator, data, _index); - } - - function getAccountAddress(address _owner, uint256 _index) public view returns (address) { - bytes memory data = _getOwnerData(_owner); - return singletonFactory.getAccountAddress(validator, data, _index); - } - - function _getOwnerData(address _owner) internal pure returns (bytes memory data) { - // the owner is treated as a session key that lasts forever - uint48 validUntil = type(uint48).max; - uint48 validAfter = 0; - - data = abi.encodePacked(_owner, validUntil, validAfter); - } -} diff --git a/src/factory/TempKernel.sol b/src/factory/TempKernel.sol deleted file mode 100644 index e2fe92d1..00000000 --- a/src/factory/TempKernel.sol +++ /dev/null @@ -1,228 +0,0 @@ -pragma solidity ^0.8.0; - -import "account-abstraction/interfaces/IEntryPoint.sol"; -import "account-abstraction/interfaces/IAccount.sol"; -import "src/Kernel.sol"; -import "src/abstract/KernelStorage.sol"; - -bytes32 constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - -struct TempStorage { - address newTemplate; - address validator; - bytes data; - bytes validatorData; -} - -using ECDSA for bytes32; - -contract TempKernel is EIP712, IAccount { - string public constant name = "Kernel"; - - string public constant version = "0.0.2"; - - IEntryPoint public immutable entryPoint; - - /// @dev Sets up the EIP712 and KernelStorage with the provided entry point - constructor(IEntryPoint _entryPoint) EIP712(name, version) { - entryPoint = _entryPoint; - } - - // Function to initialize the wallet kernel - function initialize(IKernelValidator _defaultValidator, address _newTemplate, bytes calldata _data) external { - WalletKernelStorage storage ws = getKernelStorage(); - require(address(ws.defaultValidator) == address(0), "account: already initialized"); - ws.defaultValidator = _defaultValidator; - // _defaultValidator.enable(_data); removed to avoid accessing external storage - getStorage().newTemplate = _newTemplate; - getStorage().data = _data; - - (bool success,) = - _callCode(address(_defaultValidator), abi.encodeWithSelector(IKernelValidator.enable.selector, _data)); // to NOT preserve msg.sender - require(success, "account: enable failed with defaultvalidator"); - } - - function getKernelStorage() internal pure returns (WalletKernelStorage storage ws) { - bytes32 storagePosition = bytes32(uint256(keccak256("zerodev.kernel")) - 1); - assembly { - ws.slot := storagePosition - } - } - - function getTempStorage() external view returns (address newTemplate, bytes memory data) { - TempStorage storage strg = getStorage(); - newTemplate = strg.newTemplate; - data = strg.data; - } - - function getStorage() internal view returns (TempStorage storage strg) { - assembly { - strg.slot := address() - } - } - - /// @notice Validates a user operation based on its mode - /// @dev This function will validate user operation and be called by EntryPoint - /// @param userOp The user operation to be validated - /// @param userOpHash The hash of the user operation - /// @param missingAccountFunds The funds needed to be reimbursed - /// @return validationData The data used for validation - function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) - external - returns (uint256 validationData) - { - require(msg.sender == address(entryPoint), "account: not from entryPoint"); - // mode based signature - bytes4 mode = bytes4(userOp.signature[0:4]); // mode == 00..00 use validators - // mode == 0x00000000 use sudo validator - // mode == 0x00000001 use given validator - // mode == 0x00000002 enable validator - UserOperation memory op = userOp; - IKernelValidator validator; - bytes4 sig = bytes4(userOp.callData[0:4]); - if (mode == 0x00000000) { - // sudo mode (use default validator) - op = userOp; - op.signature = userOp.signature[4:]; - validator = getKernelStorage().defaultValidator; - } else if (mode == 0x00000002) { - // no plugin mode - // use given validator - // userOp.signature[4:10] = validUntil, - // userOp.signature[10:16] = validAfter, - // userOp.signature[16:36] = validator address, - validator = IKernelValidator(address(bytes20(userOp.signature[16:36]))); - bytes calldata enableData; - bytes calldata remainSig; - (validationData, enableData, remainSig) = _approveValidator(sig, userOp.signature); - (bool s,) = - _callCode(address(validator), abi.encodeWithSelector(IKernelValidator.enable.selector, enableData)); // callcode for NOT preserving msg.sender - require(s, "account: enable mode enable failed"); - op.signature = remainSig; - } else { - return SIG_VALIDATION_FAILED; - } - if (missingAccountFunds > 0) { - // we are going to assume signature is valid at this point - (bool s,) = msg.sender.call{value: missingAccountFunds}(""); - (s); - } - (, bytes memory ret) = _callCode( - address(validator), - abi.encodeWithSelector(IKernelValidator.validateUserOp.selector, op, userOpHash, missingAccountFunds) - ); - validationData = _intersectValidationData(validationData, abi.decode(ret, (uint256))); - - return validationData; - } - - function _approveValidator(bytes4 sig, bytes calldata signature) - internal - returns (uint256 validationData, bytes calldata enableData, bytes calldata validationSig) - { - uint256 enableDataLength = uint256(bytes32(signature[56:88])); - enableData = signature[88:88 + enableDataLength]; - uint256 enableSignatureLength = uint256(bytes32(signature[88 + enableDataLength:120 + enableDataLength])); - bytes32 enableDigest = _hashTypedDataV4( - keccak256( - abi.encode( - keccak256("ValidatorApproved(bytes4 sig,uint256 validatorData,address executor,bytes enableData)"), - bytes4(sig), - uint256(bytes32(signature[4:36])), - address(bytes20(signature[36:56])), - keccak256(enableData) - ) - ) - ); - (, bytes memory ret) = _callCode( - address(getKernelStorage().defaultValidator), - ( - abi.encodeWithSelector( - IKernelValidator.validateSignature.selector, - enableDigest, - signature[120 + enableDataLength:120 + enableDataLength + enableSignatureLength] - ) - ) - ); - validationData = _intersectValidationData( - abi.decode(ret, (uint256)), uint256(bytes32(signature[4:36])) & (uint256(type(uint96).max) << 160) - ); - validationSig = signature[120 + enableDataLength + enableSignatureLength:]; - getKernelStorage().execution[sig] = ExecutionDetail({ - executor: address(bytes20(signature[36:56])), - validator: IKernelValidator(address(bytes20(signature[16:36]))), - validUntil: uint48(bytes6(signature[4:10])), - validAfter: uint48(bytes6(signature[10:16])) - }); - getStorage().validator = address(bytes20(signature[16:36])); - getStorage().validatorData = enableData; - return (validationData, signature[88:88 + enableDataLength], validationSig); - } - - receive() external payable {} - - fallback() external payable { - TempStorage storage strg = getStorage(); - address _newImplementation = strg.newTemplate; - bytes32 slot = _IMPLEMENTATION_SLOT; - assembly { - sstore(slot, _newImplementation) - } // update implementation address for used on execution phase - - IKernelValidator defaultValidator = IKernelValidator(getKernelStorage().defaultValidator); - defaultValidator.enable(strg.data); - - IKernelValidator validator = IKernelValidator(getStorage().validator); - if (address(validator) != address(0)) { - validator.enable(getStorage().validatorData); - } - - (bool success, bytes memory ret) = _newImplementation.delegatecall(msg.data); - require(success, string(ret)); - } - - // WARTNING: this function is NOT VIEW - /// @notice Checks if a signature is valid - /// @dev This function checks if a signature is valid based on the hash of the data signed. - /// @param hash The hash of the data that was signed - /// @param signature The signature to be validated - /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. - function isValidSignature(bytes32 hash, bytes calldata signature) external returns (bytes4) { - (, bytes memory ret) = _callCode( - address(getKernelStorage().defaultValidator), - abi.encodeWithSelector(IKernelValidator.validateSignature.selector, hash, signature) - ); - uint256 validationData = abi.decode(ret, (uint256)); - ValidationData memory data = _parseValidationData(validationData); - if (data.validAfter > block.timestamp) { - return 0xffffffff; - } - if (data.validUntil < block.timestamp) { - return 0xffffffff; - } - if (data.aggregator != address(0)) { - return 0xffffffff; - } - - return 0x1626ba7e; - } - - function _callCode(address _target, bytes memory data) internal returns (bool success, bytes memory ret) { - assembly { - let result := callcode(gas(), _target, 0, add(data, 0x20), mload(data), 0, 0) - // Load free memory location - let ptr := mload(0x40) - // We allocate memory for the return data by setting the free memory location to - // current free memory location + data size + 32 bytes for data size value - mstore(0x40, add(ptr, add(returndatasize(), 0x20))) - // Store the size - mstore(ptr, returndatasize()) - // Store the data - returndatacopy(add(ptr, 0x20), 0, returndatasize()) - // Point the return data to the correct memory location - ret := ptr - success := result - } - require(success, string(ret)); - } -} diff --git a/src/validator/ERC165SessionKeyValidator.sol b/src/validator/ERC165SessionKeyValidator.sol index 07927d05..d0071274 100644 --- a/src/validator/ERC165SessionKeyValidator.sol +++ b/src/validator/ERC165SessionKeyValidator.sol @@ -9,7 +9,7 @@ import "src/common/Types.sol"; // idea, we can make this merkle root struct ERC165SessionKeyStorage { - address key; + bool enabled; bytes4 selector; bytes4 interfaceId; ValidAfter validAfter; @@ -18,7 +18,7 @@ struct ERC165SessionKeyStorage { } contract ERC165SessionKeyValidator is IKernelValidator { - mapping(address => ERC165SessionKeyStorage) public sessionKeys; + mapping(address sessionKey => mapping(address kernel => ERC165SessionKeyStorage)) public sessionKeys; function enable(bytes calldata _data) external payable { address sessionKey = address(bytes20(_data[0:20])); @@ -48,12 +48,12 @@ contract ERC165SessionKeyValidator is IKernelValidator { { bytes32 hash = ECDSA.toEthSignedMessageHash(_userOpHash); address recovered = ECDSA.recover(hash, _userOp.signature); - ERC165SessionKeyStorage storage sessionKey = sessionKeys[_userOp.sender]; - if (recovered != sessionKey.key) { + ERC165SessionKeyStorage storage sessionKey = sessionKeys[recovered][_userOp.sender]; + if (!sessionKey.enabled) { return SIG_VALIDATION_FAILED; } require(bytes4(_userOp.callData[0:4]) == sessionKey.selector, "not supported selector"); - address token = address(bytes20(_userOp.callData[sessionKey.addressOffset:sessionKey.addressOffset+20])); + address token = address(bytes20(_userOp.callData[sessionKey.addressOffset:sessionKey.addressOffset + 20])); require(IERC165(token).supportsInterface(sessionKey.interfaceId), "does not support interface"); return packValidationData(sessionKey.validAfter, sessionKey.validUntil); } diff --git a/src/validator/SessionKeyOwnedValidator.sol b/src/validator/SessionKeyOwnedValidator.sol index 23d6656d..6cd3c176 100644 --- a/src/validator/SessionKeyOwnedValidator.sol +++ b/src/validator/SessionKeyOwnedValidator.sol @@ -51,18 +51,24 @@ contract SessionKeyOwnedValidator is IKernelValidator { validationData = packValidationData(sessionKey.validAfter, sessionKey.validUntil); } - function validateSignature(bytes32 hash, bytes calldata signature) public view override returns (uint256) { + function validateSignature(bytes32 hash, bytes calldata signature) + public + view + override + returns (ValidationData validationData) + { address recovered = ECDSA.recover(hash, signature); SessionKeyStorage storage sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (sessionKey.validUntil != 0) { + if (ValidUntil.unwrap(sessionKey.validUntil) != 0) { return packValidationData(sessionKey.validAfter, sessionKey.validUntil); } hash = ECDSA.toEthSignedMessageHash(hash); recovered = ECDSA.recover(hash, signature); sessionKey = sessionKeyStorage[recovered][msg.sender]; - if (sessionKey.validUntil == 0 ) { // we do not allow validUntil == 0 here + if (ValidUntil.unwrap(sessionKey.validUntil) == 0) { + // we do not allow validUntil == 0 here return SIG_VALIDATION_FAILED; } return packValidationData(sessionKey.validAfter, sessionKey.validUntil); diff --git a/test/foundry/Kernel.test.sol b/test/foundry/Kernel.test.sol deleted file mode 100644 index e69de29b..00000000 diff --git a/test/foundry/KernelExecution.t.sol b/test/foundry/KernelExecution.t.sol index 504be1bd..21c87dea 100644 --- a/test/foundry/KernelExecution.t.sol +++ b/test/foundry/KernelExecution.t.sol @@ -29,7 +29,8 @@ contract KernelExecutionTest is KernelTestBase { vm.warp(1000); bytes memory empty; UserOperation memory op = entryPoint.fillUserOp( - address(kernel), abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) + address(kernel), + abi.encodeWithSelector(KernelStorage.disableMode.selector, bytes4(0x00000001), address(0), empty) ); op.signature = abi.encodePacked(bytes4(0x00000000), entryPoint.signUserOpHash(vm, ownerKey, op)); UserOperation[] memory ops = new UserOperation[](1); @@ -160,25 +161,22 @@ contract KernelExecutionTest is KernelTestBase { ); (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, digest); - op.signature = abi.encodePacked( - bytes4(0x00000002), - uint48(0), - uint48(0), - address(sessionKeyValidator), - address(action), - uint256(enableData.length), - enableData, - uint256(65), - r, - s, - v - ); + op.signature = abi.encodePacked( + bytes4(0x00000002), + uint48(0), + uint48(0), + address(sessionKeyValidator), + address(action), + uint256(enableData.length), + enableData, + uint256(65), + r, + s, + v + ); } - op.signature = bytes.concat( - op.signature, - entryPoint.signUserOpHash(vm, sessionKeyPriv, op) - ); + op.signature = bytes.concat(op.signature, entryPoint.signUserOpHash(vm, sessionKeyPriv, op)); UserOperation[] memory ops = new UserOperation[](1); ops[0] = op;

EbZQxxjXE~N>i32}75PWvAZF#_(sDefOXJph@I+S+w zFY}2i0h(Ggoix<44-PO6`M}nC#vwjUD(mc44R5tKk(7JVQ^sx*6@rFn*Ji0uWQ%}5 z-!tpxhn-uDb*6?%qwYL6>!*%PUaqKSZubRD>l)OuSA2fb)A4pGEXf8@hf#Ea3z%n@ zhhgAI(rMQ~NB)5DDi12hDh&i_U+7BuS&h0zUQ~#Annx~kTuMJPs}3YF#`jbCk;lG} zGL{!O5ga&C8|bov{1HmK`#0;{KRZd^G0s1dt75*qymkylO9;l| z7jC9V-|B#Xz4%i3A}#&^KX=%R6Z{5@$*V)xA69o(S^O=F#(D|8f^L+sWx|nS@YZAO-BwUp_slc3Si0WhmXEjH^=gq*$5d zN5$cIR}FV;{Ik{2v3~If7^7d*Xc(v@&m~$8K4Bj*)Kwny6$`W8Z>5bDO%dH|uN!C{ zvx?nTXz84}VWx*Z^Jhj-04Iv@SNg$x9(@0n9i|@{C(Nw~{x?9BC&W7!i@uA;XKQXI zYXWPcQ-#;>MLJt;>z-$3f5o26W*~OjKF&5hRHpFIA#`W+T#mv(E$y)#>$`i~PNKt= z?N}B%{6rF+)W#lgLwV4n6JYNaw0rhaaELI9i_38wFbquz#~K__>b|z?DBXQIvBhYo z5x3w;pPWg^ejr|&yGrQqu=&>mo>0!ttwssPx;gZ4wGOBR)&v@7!Q#h7kS!e>$RQGp z;)JEb5m~cY(~S-H^R=C3o4Z`8?aV9WPm0`~dzp>QdvVsdx1;oC=pBLC=F>4iLS&D_ z-(ovJ8S#hR;PqK^9NVw5)gOLq5QN+r@YA)^ZnOF8O284XbuYv@BY2%j3r8Q;^{t;a zD!SFu3D54(xx|qbm2OqOI&w4XN=vPKz34(PJ}ygGk0@`V&?#K$k^gL`pYCSQAChFj zEe9Z(c*c@eaBT9KcFX6_z2Vv_Na@0?5f(5pVwF-YadC|&M|)VCdQa*baCQ}A<{ejM zM9aX7^=6KF#s<6LSTDtvre;CLcsEV?_F-!iR$rz+0}QKSgrkxSsC77#gUe*hEUw+W zOd-XXK0+zK`s+YAa8emnhhKgj#PIaTlhqmnHZAVdjeK2o{f$FYitb?P8f|UIhP6Ig z?7VK|c$Qb{S?CmVV#FqW6?U_(wFU}%J9~koTda2!KQUgHes0LeX=O0vrURO+PIN=6 zFvFL=*Xcy_X68!xGIrUTvh62ImbkR}ZRceQI4viBm*&Mm+q923bg8@cq{nQ)og9;p zlzjA58Ck`P&b<1mO=W7E;$oYU{#s+iL^n~Xefa9w7ZfxMmQTDR%GX+>C&J&OCUOX@ z40&6Hh+=*JYq~+Q@zNR2ugw>2eNdT~_ha}ge`fC5w47~28#N_=Nh@?bflQJ&hjm$_ zRaaH>wj4`hsBi3Iw9evjRbxRxlQA| z-=Tryp+UR*)kJFd^ZK>IL3mM|0NV$!-$j;G6hQn`-D)>@@zmm$;vVz1K;hAofJKMx zq`VFe%!qYAyHj1Q7`kcbR_J&y$eyjamVrFb%BU}| zzfL5ZmF8+w!RGvk8jW!HAP6620_6r@IgP9!>pguOhx8}eK2JeB%pS3X8|x69RiF~~ znQ>VJV)Rn70=!~GY@EJPnrViO;10`xOXQx)LeWpU#wb|K5e--y1RFUUh7}t+*y_kF z+x98vOtv)rY}&{{yN^~yEGAN*QvhkMJpCDFI8G_F97XE$%5xduh&2TQ&Xk<8jlB4i z)!wUC3=6&;qIwhUq-fc6RN}#RtMK0O=s@x3AnYV%FuHKda1CuewNm;Z>@5qDojov; zX-w>0VzDS(U#XvfA8%q#DlM86!3|`7Y+^5PkhZY72_m!eW}F-u$~gzsj$=moxT3!=c6c z_=Yijmmi~y~3Va*51+Dm)6 zhKBkuNyb)VEaiba8?gl_>w2d^aj=S$d!KB5n_Hdsd9tdU^xCM;?EN@N*VFy`<4QxO zgIAQt6 zF@vXVAlRasOOc4{mxuMp?KJ6g2!bM zps&2;WGT6V-WGbfkpHTfMmPzdUg8O6>lF5)wz&P1s@m>OwwOV;`;%(>)1dM2whj`1 zFl}*!p~E{<1qhHT%dY^8!r)hZO+2Hciy22(9oW+kZnt!hGc&uy&8M?U~ z(Jo5(EAJe>!g|rPo>{91hQJ!fee>q+>r++$qQ%8Zo7-azTR-JBW&V-v%4d*`AN>bu zgL~dF+qfq%P?7Z)2#t{x&mX_FC}85@0VvIGHS5SZZM(ckLn_{n6PHu9NTss-F28l3 zzm>m#Q%f!RLXPCpQ>RF=xT2c8s+ek;20O*HOSEjSn(%*T4~h8|tyTz?VsZTGHfRNc z!KAG}MfG@X+ogb|K@naqbJ84Ec9^F&zgH!QbSAt6oKhNtFL!QfRsBt!!d`x+E{B%L zK4(@kK9;;G#ib&n9m_!~kqDGHteW59Xi`E3aSju3$Z3l~c8 z%2?42!)2=eF2=TxOiZpC%cZ zEbOkun=UNA?+ekV~S`75=TOCL_~41Wh_d7gwI_hR>ymqRmN!S#n%N6K6%!}Yf{PH~sw zn-dh!Ft0ki7-|iu)OH&(V7mnyFsP50~xJ zlFm$O#x(WJXc?>79~>X=pBM!@TDR2<`A5F0%|Fvw7%xDm?(mIE%gS~}>k5^l^TBzD zf0|R^>s0huKik?lWtx8CEd$pNsrsk|ii>)6PPse(>E=_lBg4UP4(E@Y9>Pd5F+Xk? zBFUyIb&I@PT8k_i{*n-*chb9MwR|+vB1=;+)mkS=5oZnyUc?)zmA+SV?pSSGDP$JK z98pb5P6oC4IrZC`@y<+o0~UfT9>1Y9Hw;gvj!&}cO0kV-=W^W@$u#f~w`QIKe@Q2W zR}jrq#R>@pK1zmXi1=v>F{8`R6+1@p^Y!{=s!CF=65<>|-3e1;(irgy*c|$$&z(Y& zF0@11+Ql(oVw$;Pd!%fe2ji-|wZS@zY6-ImFj+IoiReXzALt(_4i?EA6*Buk#Po1E z53*cl4|mk{7t&x?o#?EoNOP$J6J@x30^82#?Yn&sV!du<+uT&gFS1p(-DKb%NB^4R zCRUi!^0hv?nKk=d*KJJ-;C7eN__WduVDXt>mW*3mE?b>@{kHE~&sOEMqMuv^M23W^ z_+}xIU68>(>7x+=CnXX@BmWFkMT(}si(MQuPNv1CUvN%J?JuKb`UZvqSu9Q+`AVri zU2CW(DvFw}C^*bexY|1>|$GIfCdf6wO^Up*KWltCmHZEJb zh}L^tfv4}(S4PwXw_!ypvSq(2)a;~X2Izkk-W9dneNgz<;Bb@xwZ*!QkVawW_`ofK zsgAEaogZt%W8zsDHz8|qBP^tFap7a2SQ=D}b_IreOIQ%(dK+?Hl^F{*%`NM#jWTVp zYqS-d=?}V$Vd_-espzn(M^(@k=g$rvd#i1k|0gg zxVyW| z_w8^eU;$+M(aLBjBZQYUr=F1weZK5)DiDmawH(cC<((AtX-OCm}#{wcPCMJ(*~Neai)w7z@Cl~`lltK({5RSSWZKM8vn341#%!9c`-IK-Z1@GrRB zUvLG!EV@qyz9GQV%_FFd`)sI8DX2Ui6<*0JBGgp5+-RKHx)ZWNI4SqcGmpMI^Zfo& zu0fp4#5;J8!Z3Q?QLCP8br*IO*X}_p17HttNqdK|4vBekJhvlCq|39i-bmQ|y?#HD zKecG%$$cCAP##f1>I>Xj0dU7-UzFS@^5+9Hr}w|Fo#uG=G}LrnkI$Dn!{jj#3uhUN zXEl8BY|V}=PA%)@n5J@dcR|gR9XcN38H6#LJ)T8c=a3Z5rM_*u)p+sVh&w0ci*5P1 zcuPIS(Vzugv4(KW4K*gtLd)+kRc|!5ThdmsB0FUg^Job5Z~*_@*1eXUdOM9*qJPm| zNr!fg6{&;xO1zC#baSqvdkkXt^LxWOG#a-WQR7jALuf_o=QvlRpQ)6#4*E3{=@lVu zC&8y>D@U#Q2|zd46o~W@C)s(lfEI#Vh*gnsxL_pndeUj3C-Y~i=Nu>Vdh7of7+-J%fuS0>iZk!oiiSL4>{&6O)RXgGEPr% ztt~RMtZtA#%IP2QE5vzoIG{(3oRjPup_FeSXf9Z1aFko-3*~AU;QE5@ zerB54O9P$MEtm4_e-&sum@iN$=uJ+_wY4YGG{&`@T8-L5aI*Hr{_2R(lhM%BO<+U+ z#Gk598C@gb2n~$qqQSQ=EwM!C4Xb4<6)$tzGr?*H{A8f59=_)NbIMLYwia*+KKT$` z4d)Qs&hwCPSrW@~2QRqk1$Uze6U%&d#Ly5jbO!w0RlX3Sw)V8O`gYQ4DT>21S{5?C z5+)kqAe1h)v(|#{_p9PYgHOnw?;FwOds6C1#MG@keQ}kwZ$>QFeR}P|U&&#phqqN} zxFJQ#lnIPbo1fGq$zB*6)1CwigcOJ)#Vh; z1)1NlJ$YKDSrio(4_3Sxq?Ppp-!Z6^I(z`q20&d^yBIg-OZ}Nd`IfwFGpm)6rZXG)8-K@r<|Vqj?bCr+o}ZO4}&ShZ>&$o^*um? zc%m$1)*%+r7}14&&l_ICo!H448Bx?BK&VJ8yiAp0^0xO|SLOlJ%w&jffiGehcJ*aP zS;H*lY(Z(;4Ow5Vl>AJ~a7+I3Xyb5We&}RO)+W;{!(X*qsl55~pPxwV(|ZN*_TDff zMkKu_;WaqMtFO6VL~Eq1l*tTc7WaU#(OxMH{OTKy8Lx}2dWM@ch)=3gsxj%QCSJpEgVWFm}Xg`^c#?Jox}K%>35@4LM7_ zt_=ejM;%nXbIwNnBX(^pe4G`obJM!wHy7TS=d%K!^-^zI_OV}RVGi7@Hod+P-_A-o z3X0a($Eth|I5!-BY(9O*8--zLHTpFqmt4F7@Y>F)+4MaYW#3r7ePO=vIf@+Pwr_P= zKG5Dg(pvK>15?TAaFi2qjwxJT8JG? zWzyOxps1o`Ms>8-KQz8`v6%q|uxlS0L?1Mq!TbiQ zP4Sk+PTAM{N>D!DS}2LfMS@OCqnI3Qor-iVQ;zacCaqx2%YxW9(RaNl%eGaBO+QRn zkj_e~#D5c|>*2l#9v`ew>}r>u848boE(m%B%heT7yl{(lKq1*bwrF9LGkKsPcRf=D zmoix#ViOdmt}_MR25WKAvo_e=VkSlsKrE3I?)!fYy~+af;o7i_(FUBFmblK})9WO^ zyB*y}9mKZ%MtJkDv9AVhT`Y{;Zm6ZibZ$p3lqm64N*t)yWdU;I!xHsJn`IH6QFOlC zEid0I$$T=Igc{`+aR^{0lsRF39aW(@-8aSIj_q3rB?$!bt2N2*Z zk#upN*=6RNvT*2@`^AKYs#om+X_-#VYN710whOF_q$|SFw>IcDiSyRbxe5CIjKA*U*dS#g~exh2?E%&b{7{%>@t55|ISN%X+q(q z-Gl!tmSw>DrozjF$V=&M3~1J_oy8v$)l`3CFd8c+Js>9nkgIF zBzi~$n^V<%$|A6+l`hH%8Dv;n#eP(DX|_mxG+iZB@>3<25@{G&6|Ko?*b-QlW1jA5 z7b&=Z@^f5DE&xx=JA|K0uATP@pZMl2|C~~bpwX?S7pk!4smyDdiT)&utQ)7H7O2(NoWaVG5LLr5j0*XxSs|x zpT#4$&`|A@I#V9LH{q@(;INZ2X$p3PH+04*MQDkFU0Z~znYk4)xq2dog&_h9wbpVD zVBBHkpTxPIF0=l@D(SthH*#P)ur^5D6anfv-nW-B$zkqdb~A^t);;Dn#X8oE3( z#5K(xllrc0(ld#dles4HoZo8Hm@r=79^uBqn(8Hs+y#1?-2bdg8T5xyK0#)|HeHv& zt4n%!HJN3Hjxw%^puXa4ZNj9vzVi#l{C00UfJlvKX)u@umG5b+>RrxN`A15c4j-`f z7H%0?VLw(ujo;bc_)^)knaxczmm+q{sMOF+O|BcpRS5_nz|+$HUdcT?PFx z$1jxX_=su~=_ReuLoU3{P-$vHEZ_Lm-dNuHXha&k(L7IXgX*@@&wcoe22tX7E#xJR z!}xl#)#$Xt1Z41g(<%QtP2dirzY}ebp?kJ6gMZG*3Q0aX1+z9knvJ3#5E%kT(C;(f zO84P(VrviJyeE-noPrr8HJyX$n!)8K(0QAt+13oo!z04_McYuNI}x65>%q-goU%_ zt@wN&jGo~y=#O$8oXzkRpKC!O%D%%0ScO&b>1qnp-TCbta$hxXc2C)Fng7vLcY_pa zR(|zq8kquNbEmvYxX}acW;drUrr|9-K|cgXlk`CJ?H17;2*L7IGiWSHUmTKB9w?KB z4i9^henlwkb(9!O!*a*6QCLn|^aN_MYc(;lJ*pxC*i}Yjwoz_MeDHxSyDnCz;pzC0 zLRu}f4OI>4mfvG+LFSNFlP+w$XO3YrCttV{+0A+PeKv9kEtVfBo=9N1Kc11AD_d^n zX9nAv&+-7W_NaPKI|6ZbQ3@yRTgm6Y{)91JG7j1kvwB*cSATJ9#F^dHWodn=LT%ho z$Vg@+{Iy-Y&|Hsm_hku~sB2<9%LHGaWw((2D=zr^xn#($o0iG0iD2X!H9@PW_q_9T z;(fT`yrEl*jfE2CvgvHY=HUc<6<~39eEE$^3frRv`+OVcSHS8ljGZjuimfH224$#^ zKIID|0lqb>KK{}qJQER&uiL_#$Im!D7`tjhxOaRBkJOcu@iQynloG1m*7BaTr#64S zWbVEKZptTCi5xeD1b5MWs9C3KxwBo!QsMMFdr1}XxFu`Fy7teeKNC0TcIO^LG4%M5 zFL>N_-|4!8;L$hT0x+B(3uDfIR`GV0YupA_4ph}Ie`oO0Q8!pJ`v|c?+Ye08+c_q~ zuDEDF>J0Ukw0u4X4mgJ~_-RIOzKcx+ZkuW}G8NM^XD(hIr06^~e}yR)!bD8Cp}G1g zz?VsKFL*!R4EN-IE+{)`07}7K!s=Y)(Im-Nh(Dc6`)i|CHSM+P)!yc9)tJ|mS4}WQ zW%<)CTHU_FJ?45m@!+`F`o`u)_m2QBW{E|*j3aOZDA|0?T%Situ@@Gk9x_8-#|L&c+yV4A>4Dhou+I}5YpeCK zpc>b>q`{M785LIwb`4F&_67Ev2@OH>g_%2&$L@5Y-=exHZ*OgowqfpERocsqwgcrf zR$oH68Ejv2T{kytXhe*>o{CaFUWZcj`@{6+xpbm)fvQVnQg*UTtX9-3S}Th3l_({> z99T?j5;vonrk-y%IKhiy^BWf%@6Kz7kEe4t(TQt`ug-I=gUc)Y54u3vN6sPd><6D3 zXjA|SG-~J{Lk(3q3wU$)x@ImZ{=<*5Q!D?~(u-GbdySWCH;or^tyvi-hOy_!{lRL+ zAzG*oAQT?#Y=5wDWDs&IADsCYVa!?KZeccDt6Vy)RQeG;dy4>alNG?vM|$}Et6PiE zxUubaM3xEU9&TjISZiLQUAD!->{}*YCaq zisNLs(#oX@;Z#8ga4Ui$OP?EvjNpiNCCw6ugnYJj=K*`563w6-i#y^xsHExeeLU{$ znlWTE*0WB4$tH}>*1euKr;24RfR~@UMep15)7Uw^lIS;S|_}HkSPAVh56g zxR&A4Z8+q)Vh?g23{*KsKAgu1lIcI^UtJ?I-Lmk$#r&!tJ@GvK4q#Ovgly2UP)8%K zum8~thIbhaMd}xYvW1gQvmcv%+KmO@<#RSb58H0vc|K}7#?-~w;Xn1}ar2k@<*&f{ zY4dm%+2Wc2FquzEqBw>UW7hS$Z8UabCGdNZXIJ74pH^4mHJ`lSmveW5H-*Rz;7P$a zVFF4?%JAaYqRB$>r5x(m_mOtCnqa@#zs?GY1=pI5w&G)9Gr|z-(eX1Vj+H-7QeGUp zW^3-PMQ7vrgTp}Nu2O_!G5f9rRB2i*JPjxhbnbf>v^KUY>B|Y8C?ATxO;SOEj26`-$NUZlFTuBzP6WD}R(5ot8t}A7}SY49(ky6e8NbV&y+4!-DIgSx`cl+gc zLHB!G*ea5ZK0t@k6|R9Pd$oQPRf7(PTjjP`Vp~A6Zk>YBy&(;{La{wY;%+vEuzE+l z0?l`D1ZXRw^0`Wl9eE56KQn$o8J-Nc9}3AQh6Ay8&(ye<4t!QV9r%^8A6|2KOq2F6 z{ItQG%0!7&7K&Y;>i)sbWEP(YGGWn1c|er?G^(1c*q-x~cxgjp%PDlgg+L`^}HsgKmAa5adR| z7;BoZoQ|2;UH74@=&vYd(m{Zes&uD?_(>E(h*B#&Co-d9abnE05xTYn7|T*Uiosg? zK~)}RnZ?n?YTPdB3$!lgzy7pBLKvvwDm#s|wYOiGQLU2E>4AvkriPf+5|^$WUT$=v-iOJ`d1h`dc$afj8YTry zJF)>Z4N>z!hSv?l;Xvc#A9hyDzpPz+_*EGg9J7+}poim+rG+3k2s#UCyWNkMOOv!AazS1NHW!VQyLEO+q zEmOfJn}G3pYWGOznsflQ|8SQdnJW(uIzvY7t~;WfED1;+ukyE%pYo=jS!%zW?9Ksx zd>ZaKM$T_^+$sSdj;yAh*|FOr`@JUpOSPh@p|Gr;;V6!CCU;(N(mXeYP8hK{M&x7zzLXjT7&6T~{uVSaZ~!bJMAz4W);o9|L| zYBI*}@)RggvB>|%^YsUhv>As2Iw@NL9;2JFUQ!hJ#8w6P1nmxB#O&?YU29)51e;ZU zXg)Z+fwccOP8)z|gwV8hWsJUA&sbs>INYomzDh!InrYfnCv^l@xX&@|@;CdaGIt66 zX-x>|Sr%#)1#?-lZv=l&3U8zgmEa4d3MvpqL?(gTY)AcLBB=U^i}`}bIG&Je{xC%% zPv8zh9i+A?B=MI+lnzk7Vcy?-biI_{VQVG*U_P)q!Z*PZcSK%M9-#%{1-rYzyLxfE z89sS^LB?c(h-6{y4$Ka$Ja482X7>Mudj~e-Ck}@qRti z!-4~rBE(3%wnzCl9X?H`2&!#Mihx{{Y{-H4PS9dL&FqJTTXflh$0TOalEvI3G zXp$1O!NI0J51&$>YHy%x1@Ba12|eF%J`V*5_fc1WoTFe)Xf&`%RJPW4c;L3~dMUp; zy~|`p4u+OW1u}!SD?wi+DQdkZg@iv&=s+H;wwBsQM%HN`OyMhrfbBl8G#<~umuv*y{)f3ol~2-0i5nKY@h&@ z?u5^^NUPFaQzFyu-7@dM@oUcF)12JBF^)i}30VZ4Ey1y1Q4kw)!YxX_1I=Bt@KiYW zvgPvx*o)fuiU$Lk%sBTOXS0uM7nk!npkTQTzA$WTB8&-m*PPcxk^W3|;2JC(wQ-`r@)0%8Q z@0i5)^I&w$J$;nsM{b4(Dhh-G&kJV)kTVdj-wM&YHle~jJb?=34%}s??oc`MrnB5H2?n?<^ zI`uo|nZ?^KD|yP;ZJV*JjxXC$VDkFH-UO(+(r#KR1`veoQNr%`l z&p8obBWP)ad1KNud+hM#U`G*%$`V!ni)Z!Zzz)CUxNrV`7}yK%8~}!nWF$PONwF7= zoCwoag@+6lMO(E9Agm>kduyPRp_^%}G!jOFg)oXAcUDIXxpzoMb}*T3R@CN*J>P&RNzDw^W%!A9jF}ti53~6R~U7 zz1|a&^68;24F!1ME!l=-MBBnIgWD;2%-k#jOZosl7BosPhNqHD3o^IjQ9q>1ZFNDD z$`O_C+NMeRH<@6i?ZSk5rW6c_}yl_@FnK~GNdmHLc zSU;E7py(Ex%iLS>$wo~2#HJx@}UCk8p6Ks#Q_63?ql1xx570a`;~cn9wxAnEN`eH=Ig@QR@BJ%?D3jEc@$St zIPtmYy$fkQCCxaWcrz!i2F;7` zKE&9ZF~JO~WoRR2p@1Hk6eJ!cIE!WynrhvV>7ET5lmf^EA0d!v3y^)Ho%yTtzNje%e|lcJQe0w+);`Qhx%=KS|3q+(K4>o zvhpK@OlZe|BIFD4HjE)`#j(pTOgYE6To-2iv(xeI=8mtqax9pwHa=G4*?jB{BlQOG zyd*QI9(OOJZGsf6M(#TGdGrQljdKN6bq1BcD{J#H?@T#~8J+i}e~?-+5HfhzR3rU~ zF(m#Js$~akzCG^!90e9Y zRKET$vDF$1iR68#xqALR3YPR7lQh3(4^KTXBVqJ?Xbp{sTjCRrQ9194nxEmSt+&Vm zd8ApZb|`kp zHpnhjC@P}0zcjm$e77XCJ#qh=N7XyQ0nr3Gd(PL!B&3z_avSl+)Fh3+R{A=XObfh0 z-tt8T*x$w|ebs-I*4RxGAR#Z<;x<{XPQdn|E(jD0SY9-_g=NEC_SAe8V%O)63l-|? zLitbtX0ZE_W`Ae8lIF%x{t2(&C9zrL+@{y*v$$#ISs!2#+*VBx+>GfujS}`v3o&d2 zQIC3@uVSkzAp@r#rOyzBs9o#LTd;m_~UO|uSOz&U|rDP&9u1sMBSb#%%(nW*rA=;c36 zj$Q^gtsdh%LtbPO$VxdbMJsqPGVPSnits5Y7#DbyYuBzu?K#k+uUeX8gnc(9G;O0i z>uNNkOUu`7^~cnY4@xSL3zFAIjS>Qkp?~f6baCY$Zst|AVVmjREFS+R7mXE|G3BaW z0N)RBg)InzRShh1`;*cU%fJ`G3F$cS#}r110`1wDf1{ zAD&}2mVYq3|7AQ@^-QT=C4l=UMmr^lpceC=xa$8v-hZ;Y{|kBlFN!vIN>DICHBgU? zjg^dz`xBYX#l*_V#{LNw|AdNjad9yL0BrxzZj*7du`zv0=>gpTk^1Cpvwm9S|7o)R zti#65{h9kjbAP7)^S%GzsdN8N*?*S&t5t)~X8-;2zZ?DcLH}L)kH-Gvz@H#=9x^V# ze?-pB`WfPX=Gi|n;9DUC*uekk9NT|)M(>jt{%O1a?<^V5rw)sSg`0=PfB$FPK3VZBWIF#7_a~kF6Ds}*mFM_umVh0=`rkSMmj4AL|CdgH z{nIh*#>2gq}YEcr-7?64W*`VZP35cc~5RgBzVqRmD!4ZkL(L@;jEuRf@MI zJl+Y?Yf`vL`Q+f{^0SC?8~tQCRq#KaLzcpCSDX2}qb@Ey0=$M$Th#Y)9W-Y@sNYS^ zsSwu64W=YcxDW6kpf#0(R*qGr#FjEIG|t__qUG~23aROBAXu-`7If>XCXuhzL#q?u zm8!Fg)n`qn(abiM2~5H5(0vh3#BWNhM$TO%dXbv34*g5SXihuD;yk2Lb2KSbPWo6gc!{Hu3&z7Z7awr9vl#O_o3`r6-Jl`x8t5Uo`vwLwWzlCH|jx z2`fu8SvWxoG32K?{hzGt8y7{}vvwefl;2 z%gr#+NU%=*85iK6L%Fy@(2V(6_F-d#{c7mXJg~yVo8}fgd+uhD&l$m^WK~A zf%m}@-*8iVSbLD8Nh1m#H*t!0{waqNN@e1N0T)mBxo0?}NwuJYvj&PliJ_x|Yl%Sz zOGBiBAy|MhtL|wpiibxYAuzNIQ?Mjn{?PlQ+xGIZvFp8QZVdKyS>5&1D$EeTf>GCi73rzT%dUa!p41$`)KZ6?R=m+`i(7+eSu9NhL? ze64b&J#QZG&mD|EsKLoi4m1gENdZs4PBdRUEzThdi{GaUer_c=DYs%Ko&h2rtM%UX z!@$MY81-%QLr(?~6w75KU0{PB_7cO@nI;li1Iw#xUhB|r^}-vRW#%hs_QiZYpGW{~ zg6f<_lk7|fqQR-64!*)F#y1>`_7>Pjf_q+n=GuyX|1w0|L<@>{NAFdX#rF}2Z)wIY zLoa*5R}Bd+CF&+auFvHS#^QCsn3S@)*lmkYhcLW7g8de}n6-GVDdKy1ywM&Q(G}$! z3JiT!Y`*L7k=>o6>!K(NZm<2|>vHHNZSuid_g+yWPo;gvQlO4!eya`i>cEhpMz6-y zCa(Y+J%d-BB8vbeL=_@Y8hoyjqb5|h;h^AS%X@0H*+B^1-mOgu@#|;PosfEyDusZb z7Bm9F;dXPQh2%-q1|w4!1ke&AOF&yt0SRITa~&-p(qj&S&d~}tQN?pDu!3N6Rl}1a z{wgN$sbi-HA2`*SIf-japmdT>GmnZaTXLA=sCfL5SXNCQE4q|Gr^RVH6*mK!E?u)q*0N@vIDj}zx&4J4-( z{2h)+3hrz8)hd*iyLVlp)RJR~3Pu$s9VIW3oSQN-#GYax$7MteN5VF`s@vBtgw&|$aqtPSLB+{gPFLp1MLqwZSfWp|M&s4{Rdk^Oc z=Lr>|AYaN+6QKEY^3nZJ_*I!x_80W;&DV@e+h6w^+**1i`sEwNzl%oR*MaU>KDZxI zm#((8Zt3^+Oft=i?#rUPb$XXiVL#embl^9k;owh{mV-ngCr$0D!Q{Ywpm)SqW_ZY}{ z`zSRI?Dm*W0u#g%Hke4m;6SPm`^D?7UC6r@gcfA>L0(}*?#qR8B2y9b$+BtooSjzOkxSr0&C6Sx9jN-DPYz6Jgk{1@p!z3 z9-`OfZ74j@QO`v!9I2CHds$z=J53+6i7cez_d~IDz-h$>OAl;yq&`*oCGu(K;F4j| zmVyWi?lIX}a;^Rng^!8{#0j>96Po?wcPwkXB?F>yoI48&1GaH4OeN^?E90IE%&jxW z+98hA?`8!6may@#C!jga73Pt2Bc9o5(V8yzA758+ZKyn11C$@3+2Ug}&KA(Y{P6d> z5UeS!qS@g3Jp!`~pB<8qQL01#H!$1Yih)fBA;gE~&^xMlL z-djxk1;ZaljAb5pBq$5kTa~Kd>fT5P4-&N+>>9DqwI_DlCtNuVJrI*-{eq34sA&~D zM23AEhfRnn=lvguMP&Qh$gX7jC8i&kxDuxiFDnTZHJk14l6RXv%#%8bIZ2iwKVYPa4o=?5vmmRX7-AJxFI7)1OKC?XLy`9@L(!X1q)B2>VpdXGg57t*)byYH-3vl= ztUVaS*uZ6GDxP5?ysfH5t2vogxv%I^!L@unv}~)HDwZz6s=QF-2WxAzPIlFS{^hWr ze3II2ht+kOTUoI?Fc8n(g zgwM#{Bu--G+oTdyPEU#T>tLlkk_}b|n)_G%a#fWq(F&YoDqswq>(JZ2)G3Q{HZ$ow zoCPRqiNth@pGWM@jaloTml41mWKT?P( zN>uAe9=G{49GU@@ElXZYbo+pBhG@>Qa1!T5J5ll(gEEt`o3$wpBboG=uI55WWhd^+ zPK+P1I#%4MG=NAyZJL&Rxytm{U97)Mm-bQ4-5{G#VxKCRkE*X#y zGlkL}ckVo4$;U+5*|D}?bMUclzwj4XcPb>Tvjl?fw6L>dNufBqah%m6t~*jb zi43g5($=`HQv`Lh*}-$#sQm4XedOLDQzFX}xhEMTGSnJ9=EUI-oR~oxXash%MNnS*SQt{IlePD zdM;)u-Fmab$XS28l&$*LdS~HY9=liPN2j&jz5!bvdxe4)`6gtCkt?S z=_~6YcJoir#069WdMN6gCKg+Zl@?HsKYEPF!S*2YYlD*UxMkJJnV#nQiW#uEnafmz z3yI7!6?U;HJ!(w(wIv@rY2qP6w0<^^KU3o;IyQXlmx77t6r85z>)9P8Q$2#qpIl%_2VwW`E$fDuUxl^@N!*R<$%zRe9l6BYVZ=-PXaKyM zZm#igER?iXrap3R^Y|+cjBJTMaVlM;P6%&978FORsw6W9<>`#kc+%pxcxq_^K5uW? zQMsYFYEVXQjvAOm5}*)$>oKH9lx%}6PzH`}9=9>0jdqdprud7{CA`xL@%ut-XGmU}VPlpw5_`?xGPDLr} zSusg8ge->#TfapeT&T#Usw*M-x`o9?Um}4)pS#Ct)}pFn31y9_D9?K9d?ID)$5Dv# znnzX`8#F%Ui=JRr*8_Aa8Yhnlh1!;EW85xUNJHz*pNh17>Qj<|=@l7h>m&*SMBhTH6UO~`C_y_3_? zG7|N}(=iD5V{3r9qh&J6y5o_Lx%%%80yERij=BD846e}ij-m9X=QRoQ#{K}f{@LMx zpuWp>ej@JWl@T-Z{gn|nGq1EHkj_#)y!4V`m_v!y^b+$Mc$( zx#`M?omqc(fJWbDZ=j+>b1F*1qb?Sg`NoKmS$}7MK)+)+3fH499e3)+2%A~`uMsqJ z_U?d_e&gRAe0_%f0StZqi6|U>{(-204$b~3=njuS+#65UI9z8>)(qSR57tCnb`RDV z+=-6V(I}vVKL218T}SG8lypbxa1?xp#nym_{@hJ|Ebgz4(rs~0=5i0EktoLwys;?O zj?%3G3w_W{el#wn=O-+vsDpM}9Gw}#Q>i=3M<3~MfJGl^d%!?{?}{P__qe0>h9U;H ztV8M`BnJ1*Goe39OrPqCA{$p-zyF#d8JD%A_6kVR78HI8wp$&52L3ra^m zxde_ge6o!AxSS-B0c`AKA8GMjFtHM5#lF1k*d?$W^~d0GtjFM(`2;dUlJhAG;`7N1 zVrnVs18T|IU;lhfb96M8g_IyB8sLa&V~NB^SJO^ckCe@il>HNVooCdM@PaLlos1*4 zpTf0oEGxK?8kOO6ou|8&8g<^v^W|$h2R-m>0|({T&bf^d{sktrLl@S>H0g6ka0kH% zzDt4rId>^+z>hQY^t@rWgX`F(LZX&e4{uTxg)e6L93@_bV-=Yk#pl#nNswTnOZ2Rgj3lkA%CrCM3kXGpSL~Rq z=z+FV_86?_4Ro(`l0Ub6k%e;mNloqq-7Buhmjx;F6>-U+$h6a*7v6Fe5rdjkRwRxY zW$cx`f@alaYE)Lf9e)RLsd&ZA(#R0f+2-DUExH5g=QYO8j)4}Gy&`4_WSEt`0%omb zrc|`WEvbvJLD>b3nX?U`WF;$GZX^h=&{<^}Sy}=4vXEI75RQu1&sho?L?9hw?k!Z& z6X-xGUDgt%Xc=UtlrC)vQ*;a}R0$~vl4tQ`ut5?k1mb0x%3AFjbkkBYl(b38U-MMu%EFb&iy&m4 zK%puG5|*?@{4%1n$i*O8pe0%nk<2ovp4L=(G#8{WqCgijD=bq6Ql_O=ArKysCQd&iH>Ca4ETu)r2a1BB|`#o0X2d+ zKyx5f5D0{Ie!@=%pvI@BqlTwurADVFrv|4^#t?;9`F5{w0D;>L--6fz*@FCt?0|Un zy<5J!#-Gq12<8W_3#$wHO6-8`0PTQ(#lB_lp93ZY!36FHrVHhR`iOGHm<#Iw?m%*d zyhXHC<6i>~1or_#KeBHzY$0tmmeX!wZBcE>cEfk$`cHx9fX6}#Li<2G;$5L{iFUJg zD|Mp_b8kU*zxeloy{w2j@WXkaUNLQf83-AW<|0nRd%)J>*22~jPJ>&(Hquo<68Y=- zXZbgS^MS1U|c?lG63 zM$uOFT)7U|t_rI*E;4^ue)Dyqnjkfy?{`$I(10jjjTkk$XV%U}K7UxDK_euyD->>G zL8k*qv~ey#Mly!Uy6>^|FW0z9GEd`P8H4*qy$|5;)Ufj-ZpyEQ46Y}0&>;W^!?xME zEyV&#X_PX(MBYA|1bt?0E&4P4-P$fYl;Zv4V+;6k4)NOc7qd$Ht!jlqTq4-AG(HOd>D$sf}J)`9Sfa0_QE$3MgW z2RJv_2iPk_3rY*jBj487Ercz$E%WY8Fd=Y1C|!tGuok#Sk}KjZ9bwchh%Npt!frtK z4{+cQ$ajcGge&uIt#15o%Wk@E>FyMNOn+vu97sV(B3K`UN2n{-Ez0gNe`Egwe@cJ5 zZdm^Z@G$T&Fj(+Q@C|4purt^*NEdKk@Jq0JhTEr_Z16Tt-1HvuF z?hJo!Fdgt3$R;o@NPS2f2pgyl1Wi;A=vpAk6`KL$7Iim4ca%RaSOxeLq&m1dggRI@ zBm-RE)oj{3xpy9EjSPh z9045K->2K5o247A+dvqF3^E?27IGG>%-_Txd73mHN(zb!YzJIjn1~Dq4YC$2U+Mf~ za`^4?8T4U~yVZ414%}oQ11{1j!oQ(K_0xh4xvP*YPa$Y96jz zo@CqF>oSau<;)iP)9dDgOre3;mvL_TrANKz++QcN`rfNAgZy3&1ax(EzK2{qRg*fB$Mz|`?0&IJ ze|19ii_;Qv8$xW5)C>mtRZ~{$jiF3PwVcA=Kf;kOfIp2Y*OXl_N40jt~mq zESRW})`y!On>}CQwOEfXnROE(#K=eKCsXL$CAHsMc=0L>XTbM}#PSr&_fkk1V&LU3qTD$*zY&X$rXLJMQ?o5+~W!o0OM{l9meo$8MQEUbe@1gx9;~*I41s2AXp%vmaR4=kNTpG9Kg@$AQnxtAXP;IFuGhINA&7<PRN|=J&&vG zr#wb#dfzjiKdEKJ&iv`_o*BdQ#Xd&IK|cb!!Hf%JIzgh2D*7`_Exz`TMz)uSoq2ip zRqe_VdEM1pv^)S~2NDtN=dVE6tGQIi^U8Cy7ywf92R3S3W4!6{~F`>xfuSr+$S0s zI)Sgm_C+XIYxhXp9xHa^dP>912n~DH{`ZVet*ga${TpU6u@8&~Daba+d#yAcTpW}6 zNhC}=A2%_f0OWDX94UqoM`GEwhaTq?`7Em9&;<&6f({DDw>0Ed%>Aq*=AN)5HNtUib->wf*8x4@JqZ|ux zkYuxzv#YQ1Ql`RbI9d=s6;g$yoPo_9aJK3GPAlIGoK8a*VgjAUo~c65`mC@JUK~Rf z=(#ywl|fupzG55o8NzFmcQ0O*9;y7N0+B(@|Bji_Iwk?@f<_ zX#)pw>u|%E1eS<|{B)%aHr~@H%~09DXiVzyG_$pSL|2Ct8$R{P^)2lG?wBPGuNdOz zqtVWvmU6#keWpf=ksp?gjrq=KN09tvvM!vUOTD~jT1uM0!a>dDXK<`qx(H{1iQGJS z6}C=t?VwB^1&u3y%&-XE-A>#I^aEumjQ1BIa#TOH>)kB-1`fC%AmY?eH>E)|wIW;M zN!d$IuL>mmJU!p|e{EfNT+QGAr-V|{B)3I--#r@o6b)G^?Y(J8Xsb6xv{a%inxfF& zOQoctt*s)JB<)>NzjJ+jKiqe}`%fNE=bYE;yv}Q#%kva))w5*E=tEz7QT>yzzD;Zi zi$znhyMxMNWv#r2W1J!_`+j1C8GSAumpg*@?CwALV?oN*ad;r~O)}GT;TIJ*?)orE z=a+{R>4WmUQ8b(m zroZfkpNAI5wV}7&#)IY4(#5l+^08O>R)jtkdF?%U9Tr`;LhAhH+`PRsT()^SJ;B~` z8w#7WzYsE{?Re}45!u?U4~_K(R=)V2U$M%0>?1pSTVVWxbxzb%ZHU0$WP5|DAD)Q0+&OS^Oz zFJy~tl=v=<-Pco<6l)CS?h0Rfzmzj~{LrW#$IjSSW^J!nziO^WIG?nIiXi2O%Y)aR zwv@RQ(V*_5Vo#4&lTk2*V6XbCVHD!IdZ;jYV_kQSgBNA`?Ri~!ZQEF>aU-UR9spvYvMd~F~Zfk=~|Ex+CTJcRg#0POmmuCjxJ-_ z_&CqpLV5D%6T6aS>YHLn;^mW_N>a4`K0e4R4x>NPJxz}o(bA?pNEZOCan!;3py-92 zS+Ts)n%5pHpDyvMW`0!mCPU>0>$BD$1{2EAasG9W%i_PXCCd~?#Ubl{8-S)#h`#OD{RAMd9M zv8Fc;@3p*Wf5Q6KAXCDa^;xG}zxGb<&X`rk(-8UctPioBZMzz#}A)SvIwsVWGNW`Z$QzT2Nh|} zS6{L^wzAP_TT1dF?HgooH6EIQT_rh6J>;^Ax2I1A*{%vqo)rI)w z#-%XBg5opR(=9sd@@hkP%l);p1f46-f4|=QgR{AJL*KZI|I zQ8IB8)@B|rS7s;5^M_3ePq9EBb9M}0Uw^n#B?!g!W{;u*-|W}X|GD5ZM58=(fQ#)s zpB(Z^*I0GygiAqXm;r|p3o2lt9u=VOaCvv2SfsqWo}6fzv*RN%*Xx?&9K0-*JFD3j zn2{-r%p%0cu3Rjn9fPfu2K`&|8Z7QlcQk|boNlidhv9j z`6er$@&LQRYH(oc;+%EZB)7r&(@h614isy%N5z}57u)X1J#UzM`x*aR0~tq`&`;oP z;tcN;wl$I7ftc$XVsv5meYd^HW{a|+8QUc;7Lcjlug6~|CVkW9q+;nw=4Py3n6J%z zVsu4d(Y+enxQncci?(d4G!e_CP{9ST`L9PGiLFVI&VSAPq81K%zV~n!r zroN}@(nr{-r$O;W`_8n47aiHiK4h&|w!h|#Xpd?Dy2M=DtN5t6O3v~OAxqPuQZsAE z>+Z>ejEIzLs=~H(RhBpUv|5Yb_eaTI-X5UY@<#4yYenf{_o-^W^+5(J=vu7eZlkG; z+V~>NRi01ub!>3fIo?3HlLH7<;J zwtco#c(Tmk-Fiaa!SibTYUxl^tfVd?Z|$`vXgKsI(>uA2TAh4sC|I67Td#CW=wloG z(u{jFTNHclJGpH60TS6$Moi+^voO8~!!Zq}N6t&!!JTvzw0iB@%+n#8cm zTI%-tRw=usw`P;UH^9b#(o|z z`^FqpRL7doQS;DK57UkqFG3SeqGVpWqzxX8=(EZPbvgZtNFCZw7|*WA;^=~|U3jr7 zC}nxj^55As<4Op9 z4z3WgPee%xuwoTVI*RSQ`xo|}PCbfQed6!SrS zZ1M-Kin8a9U+=8u$`1*LG}}uD(({yF(4BktStXUNy&>|Ig43ePmn#8}vZNCQ6-qKS zQa+6gKYlQ}pXK0GO5tco{_XC&Sz@@%F@*)&;CM4@{fC8_QYj%FSSH;BzRJB_*I7Sc zHHJK2SzBgTCq#J!<2KLL-G^4k?kYjSt};*3YDtRjLGmw0bPx5Ym54AlFb$e9u zQFlD{DL8Vt_v)Z&{pII5R>%9yTdH<(t24WLjB3t_qHgw~-`57~F7FdR@#?>c`~{h6TmF^)nN!M- zg53O#lQbP{XtK4$qBQ1IhLm^iA1~61D3e^?w^=D-dt^EOVMLk0vgA$Za`LlJP`*Q> z$Hs^_)Sfe(TJT`(a9sSR{e3T@_i6^O^NaY2mjOYc`h7G~(Y-k_y(*B`>AfA&jP@dG zB7KeEA4>TqeVS}*&ey2dGq7uMdGbZba0bsA=xW|UT~M@CTT2QP538w^$$aie@K-_W zPTJ{RQr@X{g{AA5${wi9E*tJ;ij`jYQ) z2VU@v39si1eJiyWxt=xxiR>;NDVZv1^EWbXXtAQVZ7GQwq{~oQ;Vl2`MWgubu+fS8 z6E8=+?i0kbBo=u;);*7`(&(z~&dpt};?-{(XLuI-FhAAiohi4#>nAL{UVuLi8MHeV zY)pwL{~VYc8*o~D#=~Tl5kJp->mJex33V6Ttd0M8ZWu8&%rVWU4ao~OjM>YN=j>hK z`Y;)2cUM~7;vrL7))~V|{`WH7&X%UvFPpkLS)Cqa)bCk!Kcw(x;zno3*CXSnx!Z*O z@FmKo*Lmn2lTszjRjMr~f)mIJGy1_j|mocT3uEh~7;FN%3)oC zb)TZmIs4fL%;h@YulNzjb?^Ff=CmtMm=m_`e8WpS=ctyGaGJZkws0^at-Yx6%+J(` zS%L3$eUK)%+SX4 z>=uX-nI|_Z`U>xQY?WT`m z{4ytd{U&2@N9)(aeb&~C*NcyTX$ujc(N4PNlcYu4Bz9B#QjYW0m!$Bx9gnn=e2)9L z|5H+G;o4BeXfEvVe4hW=id*R}TDkG?y*e!7!lkV({A?HL>5dG$yBdEj%$Pn_aUeG( zg;bMy=45z^on}bZmu9CMV^H&OoKm*$x==+Ae@>9|6w|O9QF5-JVV^BmHK$cFH;a3K zRBgJ;!VPZkMuWTuy<(25PQlMUN3CH=Vwyumg35=TJgt@|XGcic0qBt#ETb8q{ zc+{2evd-XS$fc!4Gv8>^$NV~upGm1B3ipz?z2}}We^lz;@K&Jp{_XdIXC578bEQ8R zk}^0P!6p~g<#VYHXXa6*GrsOR7q(gSvwG!?M+5UprU&owTy9-+QWe2sPkW(>QU+=0X*Hs{NwK<*qs>JojT^(0-hSndahXp%`_>*lBXUt=0|ff zg_X2*Us@hgnX|i^;iXjeU3fubkvGZ$`qIcW@bHnLCS=EBoMA?96>7obDAhgvR&-?B zgb*~el&)CG{}1a6P2-Sy-8qjBE*Gu3uhb~?pWJq>yoD1=KDal_BJ6bvJ;Wc2?%DpL z$X!F&TIuMASG4uiEIU)GFD+bn{aT zyP7zdOr9Fz6kMP@Z3gT`7~MC zGUB0B7muPV2*xR-YhGEM#_4G2i^E2*?t_ZA`B$2x2D?p4X)&Q0B`Z1DD>ad~$#jeh zwK7I0v}iG$d^<~}Z}@ysNu;+GF}l6G!F=jki}Y>WBjZCQhuJM>PW#9Tc4`%{{V4cs zxYqR`Pu@=6;mmSz(ny)mRX2G2 z;obB@CKhCp+wmX1t626##x!{@b1+f=ZOke&_r|1UA*Sx2S8 zEQ_N}ObB6Ne7B*)oYm|ci;O~?bYvP?qLIrgl5G#`Pu(4iqNidszkM&&{hY|I_Mq{d zgCRmFuwKA>ZMVKo&E@IJ2ciwqI(MosM`%jZ6|Te#XxHbci)x8KtJpmG6#Yc=U{o^OnIcEc%X&&aB109(i@zn=NYW}A~8lk*v>WG22h!rh*ZUeW0# zr4ipQ?>!us%p&_UXye( z(+wi%IoTKFDo2?6Yq6l8OFNww$n{Nk&@unUkkxK{VD*lK4NXqrs_H$+N38vuwQ<-C z<9#7j(^)2k@#*+6frX-s)Vm69&aWc1;)V%Nqtw(&Ur!3W4J%(Aa&Fpn;(IvyKm~==da$`Y%GbP@HDBxQaaNJb}X!Gz$f}48J*LgnYN1q5z zj%&kV-(Ky)vs;H|d)~GUJ*9Er@c{EzP8spwyId%%*0fmv_k_D=9-ob1Ka0fKjVH5j z#;~wOKbngWP`zo(I5r*MI&n>iC?X+IcRwz=Pexp>rcXlraay+n>AM<~xXoHcjOTE~ z{==K)>NfOKJ6eW6b2t~LF(|%lwO6UJ^2H5(e`4rcp5G?jc}4s#lv{OY$3?z-_ZMbT zIo1dHb|`iB#*4d^UYv?Sd$-+Kmv^rp_dxq3ZlF&cw$EUb4C@$JjlN56yN*)hp0X#MMwUBk^p*)P0bKc*I$JrA$&U>P&UxEI+D z*|`ncnZI{>?a)26-z2h5PMf=VDeFkT@!nK@ltguvk>wJnYLtXs-RNMVS-x(|fRrQM z_W1>Sa@4C;xi;@m1rbqY<&n-?H&@1a4;Va@xA`W#tUNudUPWY&f7s}FS@*Q<$qDz+ z=9bua#Q^3vLra_6=B0RN{~v}X8uKshiOhlk46&pm5~M;|E0`Jd7PU5af^CcWc@w$kGDYJP~ z4@cL5CuK8}gwdOvx|%C7q}oWA^(W#Iy)BKKtyV_ujU}cGr`kQbrLrXkyuQtb2bRb3 z^xDZ`-_3^>nI=aEXt*VjlS5YHlVzK{EFK$&=y}aT>+VwO%X2mOPbyADi!`5O}-@)bi1Cgs{M#>pFf%PM5&OsLknO2hLHY3xojW^9LFLtCeGLcbPGON>#_ z=jhuBtPp!*duO<$OFnDtOry+-^7$8+c9_tUcbA}d#!eFZi}|!YPBZOdW;iL3^I_02 z@Xe)N-g}SU)qbnKkHm9$8Wq4JZ?()iCy+C`{V?A|16z$=0*1j@_o>n5P>E9*$AxLb z$CFtS7rHG??wG!}a_D@n+v&Br-RXIi{qGYc?{)(8JghGQMLx)ZAc~^Vzj$@j3^+6n z&O5{Z%YX~zK+p-$paI3L?;yv&{M-s6qJ#}_(BL!v@NplWIfCgR z4dypf(aH-Ezy?^yF!_HG6?dUAzidl3@CCb7_eMbEHg5zQdCD7c!txgh*a%C+0zNOG z-{P=1@CU%VMPn%{;Q&LB@+T6K2xz^44UEBK__5&lz)t`GA}^T9Ps9@WaVX?(f-WA3 z|BI)IA^f}L#%l<>?POt2#$Q|JC)@ZUqdh51fOh}K*Hnt2v3k;Fm;){^lNyOoC zfZ0d`A@IsXJPA*Uddi3YB0mH8fg%zJI10;?3L_%H4qzAwg~bxcUJyb90&5aTz(!Pa zNPtWY^!p1#0s<_MxCJ8s%TSNQ5-}*iqokUPB@qemxi}O7U=Z~{0*Yc#7>31eQHFp6 zd~2$4C?bvkc1n$rkVrg^S{W1xjY9%f_HP-`FUuhTC;JySl}c*@2@psBH}Lm35(!0w zD@Y;%BIuTJSo~HDFuGymAQFjyg@Ys#5pGrt&FI%MKGXTZxIY~FU(oN9UcVN7QtxTRx6AZ5eNk3&NkSj-|ZI5ZCC)j%*2#4SuP z4o8GX4lv)AXu=S{!wg%jMZ^+*`3%_qf95Bm;YkIF0nb#x5)BfI#E`aHhDg9t3jyOu zfErJ&G#1#DDvT-i$AYIYs6YyaBN4ZxWgH1fDa(}4|CGk!u^=Si7#_I=BjQmw>WBbV zC1EK0r(TeRLgQg)j3r^fBOcV_K%qfnsFk5Chy(9vP^||-2?=*<9Et=6{u&4Uw-X!| zWVo#h65%lm$}|D)TsSNN*a0ROPawb?4n@R+EJc+o!2WRrG!92C7>NT4Qr=LYeEw%@ zFc(XC6@dx^jt*LZzcGpsERsqHs6uE^onV&6qX~GBf2bxS@n9$adggzEDGTDkyCPIV zNEpnP@=wB0W>bv=5wFvEr?qM^bd00QraYYi$OiTX%@GAIo7*@0+9f^Gw5Y64ghL#;HDk_Rbo za8N$KH%wU%M?yi=Ac=?sZ^lqzU@{3La2SR`p^?-IB0=wkhJ_tP2t16zI8b^2cO=li zts4Ld1h~_H$8SLHf(a%Nktk|qfDrJS#s3!k-3o#Z0t-7j$^$iMc#?uZ0|#7~S_n`N zB$<@$$$Ty36i1*<;qUA zIU)fE^L``=0w@1Ro8N6bsP5pdK{XjoGh6s`XY(Y?EVWk(C5c_ZU^4HOk@YpRa90?CVm=#Dwkdpp{?63ZhvLKcOb2t(S zyVcWi;7F(!1Vsmg&YuN;?--Q#tr)l;QEd*$g}_CEIwJuP)V3{?e?4#Y_mNP>VPJhC zzz6__3n75|3CD=UU!hI$|34WC+|;Pe4;I{Vxu9V1ya29#c-c2>ycF3Bk<=`Rn~1iW&Y>8kBeV6^jUxEv)8)G>All2e&9w|I8&Jq2GPj z-yoO_*O~-!HT>*I;D!!2H3Y(}(3Ak{Q*90cCIsIbz%HMZ?ge}k0kZ-D zMS!JIFpdPODr_8x9LkqcROb#Nhw9uZM@K{wQ3`OaL6Lwp8(<*l4XCuHOa?`jKz?@@ kfndZC8DzAaov-qvh$!;xT?8)^_*;-s8H9vX&Zsi{A5_qZLI3~& delta 135733 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